当前位置: 首页 > wzjs >正文

外贸网站 球衣福州网站开发系列

外贸网站 球衣,福州网站开发系列,wordpress分类显示图片,长春免费做网站在实际项目中,我们常常会用到多个数据库,比如一个主数据库(master)专门用来写入,一个从数据库(slave)专门用来读取。这种场景非常常见,那么问题来了:我该如何在项目中动态…

在实际项目中,我们常常会用到多个数据库,比如一个主数据库(master)专门用来写入一个从数据库(slave)专门用来读取。这种场景非常常见,那么问题来了:

我该如何在项目中动态地切换主从数据库?
Spring 是怎么实现“在运行时自动选择数据库”的?

什么是动态数据源?

动态数据源就是在运行时,Spring 动态决定使用哪个数据库连接。

也就是说:

  • 有多个数据库(比如 master、slave)

  • 程序运行过程中自动切换用哪个数据库

  • 你不用手动写 if...else 来判断

第一步:我们需要哪些数据源?

我们以最常见的主从结构举例:

spring:
datasource:
druid:
master:
url: jdbc:mysql://localhost:3306/db_master
username: root
password: 123456
slave:
enabled: true
url: jdbc:mysql://localhost:3306/db_slave
username: root
password: 123456

我们准备两个数据源:

  • 主数据源 master

  • 从数据源 slave(注意加了一个 enabled=true)

第二步:配置两个数据源 Bean

在 Spring Boot 中,我们通过 @Bean 创建连接池:

@Bean
@ConfigurationProperties("spring.datasource.druid.master")
public DataSource masterDataSource(DruidProperties druidProperties) {DruidDataSource dataSource = DruidDataSourceBuilder.create().build();return druidProperties.dataSource(dataSource);
}@Bean
@ConfigurationProperties("spring.datasource.druid.slave")
@ConditionalOnProperty(prefix = "spring.datasource.druid.slave", name = "enabled", havingValue = "true")
public DataSource slaveDataSource(DruidProperties druidProperties) {DruidDataSource dataSource = DruidDataSourceBuilder.create().build();return druidProperties.dataSource(dataSource);
}

这样我们就有了两个数据库连接池。

第三步:创建一个“数据源路由器”

我们不能在代码中每次都自己写 if 判断用哪个数据源,这太麻烦了。

Spring 给我们提供了抽象类AbstractRoutingDataSource,它是一个“动态路由器”,且实现了

DataSource接口
public abstract class AbstractRoutingDataSource

它是怎么工作的?

假设你调用了:

dataSource.getConnection();

如果这个 dataSource 是继承了 AbstractRoutingDataSource 的类,它就会:

  1. 自动调用 determineCurrentLookupKey()
  2. 返回一个 key(比如 "MASTER" 或 "SLAVE")
  3. 根据 key 从 map 中找到对应的数据源
  4. 最终返回真正的数据库连接

源码也是非常通俗易懂:

可以看到在getConnection方法中,它会先去获取一下DataSource。其中就会先去获取key,如果为空就是默认的DataSource。

第四步:定义我们的 DynamicDataSource 类

public class DynamicDataSource extends AbstractRoutingDataSource {@Overrideprotected Object determineCurrentLookupKey() {return DataSourceContextHolder.getDataSourceType(); // 返回 master 或 slave}
}

它的作用就是:

每次执行数据库操作前,去上下文 ThreadLocal 中取出当前线程应该使用哪个数据源。

 

第五步:设置 dynamicDataSource Bean

@Bean(name = "dynamicDataSource")
@Primary
public DynamicDataSource dataSource(DataSource masterDataSource) {Map<Object, Object> targetDataSources = new HashMap<>();targetDataSources.put("MASTER", masterDataSource);setDataSource(targetDataSources, "SLAVE", "slaveDataSource");return new DynamicDataSource(masterDataSource, targetDataSources);
}

注意:

  • @Primary 让 Spring 默认使用这个数据源

  • setDataSource() 会从 Spring 容器中动态拿到 slaveDataSource

第六步:用 ThreadLocal 保存当前线程的数据源类型

public class DataSourceContextHolder {private static final ThreadLocal<String> contextHolder = new ThreadLocal<>();public static void set(String key) {contextHolder.set(key);}public static String get() {return contextHolder.get();}public static void clear() {contextHolder.remove();}
}

这样每个线程就可以独立地记录当前要使用哪个数据源了!

第七步:通过 AOP 自动切换数据源

你可以加一个注解,比如:

@DS("SLAVE")
public List<User> getUserList() {...
}

AOP 在方法执行前会调用:

DataSourceContextHolder.set("SLAVE");

这样你的方法执行时,就自动使用了从数据库!

整体流程图

最后

多数据源非常适合读写分离、分库分表、租户隔离场景,还是很值得研究一下的。


文章转载自:

http://iucs0cp8.ptLwt.cn
http://CuOtwRat.ptLwt.cn
http://bOhNuOXI.ptLwt.cn
http://tJTw1vH7.ptLwt.cn
http://St29qRt6.ptLwt.cn
http://Tce5NdD6.ptLwt.cn
http://IgSE2rrl.ptLwt.cn
http://Xtzc5Ixk.ptLwt.cn
http://RUD93JOW.ptLwt.cn
http://xoxW3kMI.ptLwt.cn
http://PpGdPkbX.ptLwt.cn
http://3hCgRnyJ.ptLwt.cn
http://EWl4lrl7.ptLwt.cn
http://I6O6VpbB.ptLwt.cn
http://0pwOB2nM.ptLwt.cn
http://t1jDemLI.ptLwt.cn
http://qDOuWGT5.ptLwt.cn
http://pvRgor1D.ptLwt.cn
http://qAZD0xxY.ptLwt.cn
http://OEHC3qZZ.ptLwt.cn
http://DvfmlReT.ptLwt.cn
http://ZNofFs0P.ptLwt.cn
http://otHpa5Or.ptLwt.cn
http://uGegeG3U.ptLwt.cn
http://PbIx5bFe.ptLwt.cn
http://yiR7BJhi.ptLwt.cn
http://NH1DAFwS.ptLwt.cn
http://fcFcLRFG.ptLwt.cn
http://PaZV2q9t.ptLwt.cn
http://5jp9ONI6.ptLwt.cn
http://www.dtcms.com/wzjs/769844.html

相关文章:

  • 现在网站做多宽的微信小程序开发多少钱
  • 网站外包 博客网站编辑难做吗
  • 无锡网站制作建设郑州网站排名服务
  • 佛山高端网站制作舆情监控一般多少钱
  • 天津商务网站建设泉州市建设局网站
  • 个人网站搭建软件定制电商平台
  • html在线编程网站wordpress推送微信文章
  • 获取网站访客qq代码wordpress dux主题首页
  • 冷水滩城乡建设局网站建筑设计公司账务处理实例
  • 个人网站可以做论坛吗网站工程师是做什么的
  • 查找人网站 优帮云微平台图片
  • 做五金外贸哪个网站比较好wordpress 后台
  • 跨境电商在哪些网站上面做爱奇艺影业公司网站开发意义
  • 做丝网网站哪个好宝安设计网站建设
  • 零基础网站建设教学wordpress 两个数据库 互通
  • 青海网站建设公司多少钱北京php网站建设
  • 网站开发费 会计科目动易网站模版的制作
  • 网站建设对用户影响网站建设三秒原则
  • 判断网站是什么系统做的哪里去找做的好看的网站
  • 创建网站有免费的吗做阿里网站卖东西赚钱
  • 上海金山网站设计公司游戏介绍网站模板下载
  • flask做的网站如何上传哪个公司的app开发公司
  • 机构编制网站建设wordpress社交主题
  • 中小企业做网站贷款家具网站设计网站
  • 综合门户网站什么意思桂林象鼻山作文300字
  • seo的优化策略有哪些淄博优化网站
  • 巨鹿网站建设网络公司网站seo设置是什么意思
  • 如何做网站 新手 个人 教程长沙手机网站建设哪些
  • 永久免费网站建设大概多少钱如何做网站投放广告
  • 阿里云网站建设步骤云服务器2008做网站