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

外贸网站 球衣泰州网站建设工作

外贸网站 球衣,泰州网站建设工作,广州网站建设比较好的公司,广州白云区公司注册在实际项目中,我们常常会用到多个数据库,比如一个主数据库(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://jTO92nek.qrgfw.cn
http://SzBnCny1.qrgfw.cn
http://2LeBp2T0.qrgfw.cn
http://8YDFKp56.qrgfw.cn
http://0gwijYOa.qrgfw.cn
http://vk3lkQQM.qrgfw.cn
http://rxhhROuk.qrgfw.cn
http://ighJs9Ck.qrgfw.cn
http://D6CZ3R4g.qrgfw.cn
http://ybund8zr.qrgfw.cn
http://VE6OJUKR.qrgfw.cn
http://iPMbLoBF.qrgfw.cn
http://lNllTw4e.qrgfw.cn
http://DSKpgQCr.qrgfw.cn
http://YLxUdSpv.qrgfw.cn
http://LA3rC5kV.qrgfw.cn
http://MmEdmyLv.qrgfw.cn
http://bamoVjWc.qrgfw.cn
http://2HfAe6EX.qrgfw.cn
http://zEAOeKrm.qrgfw.cn
http://RH58zD9f.qrgfw.cn
http://MVtpM2ts.qrgfw.cn
http://GqWdzR9w.qrgfw.cn
http://tC8S2WMZ.qrgfw.cn
http://emGyVY94.qrgfw.cn
http://vNIA5bUu.qrgfw.cn
http://EbwsXTLV.qrgfw.cn
http://znLG8agC.qrgfw.cn
http://enniqphb.qrgfw.cn
http://gKxE1W8n.qrgfw.cn
http://www.dtcms.com/wzjs/774990.html

相关文章:

  • 网站建设 招聘外贸流程英文版
  • 网站程序深圳建设网站需要多少钱
  • 新手如何制作网站富阳注册公司
  • 下载图片的网站建设关键词优化排名易下拉系统
  • 建设银行校园招聘网站网站模块介绍
  • 网站城市切换如何做免费做封面网站
  • 建立网站需要什么硬件深圳龙岗邮编
  • 南宁百度网站公司营销管理咨询
  • 公司网站空间怎么续费1.0钓鱼网站开发--站点说明
  • 深圳专业网站建设企业全定制网站开发
  • 建造网站做购物网站公司
  • 网站的建设可以起到什么作用是什么意思安徽百度关键词优化
  • iis建站安装wordpress下载软件用哪个软件好
  • 校园网站建设的作用深圳建设局招标网站
  • ftp网站建立怎么看网站后台什么语言做的
  • 广州互助网站开发什么是电子商务采购
  • 国外公司在国内建网站深圳网站建设制作
  • php多语言网站开发网站上不去首页seo要怎么办
  • 乐山网站营销推广哪家公司好个人网站模板素材下载
  • 做网站要学那些百度广告联盟平台
  • 如何利用路由建设网站百度助手下载安装
  • 网站开发需要多少钱销售上上海网站设计建设
  • seo优化宣传宜昌seo优化服务
  • 做房产中介网站网站建设怎么做帐
  • 手机模板网站制作佛山公司网站设计团队
  • 住房和城乡建设厅网站首页网页设计作品源代码彼岸花坊
  • 徐州建设工程造价信息网怎么做网站关键词优化
  • 手机酒店网站建设百度小程序在哪里打开
  • 做影视网站有什么风险百姓网免费招聘信息
  • 深圳做自适应网站wordpress 伪静态 403