微网站和手机网站的区别,wordpress首页分类,医院建筑设计案例,永兴县网站建设推广公司大家好#xff0c;我是此林。
SpringBoot 手动实现动态切换数据源 DynamicSource #xff08;上#xff09;-CSDN博客
在上一篇博客中#xff0c;我带大家手动实现了一个简易版的数据源切换实现#xff0c;方便大家理解数据源切换的原理。今天我们来介绍一个开源的数据源…大家好我是此林。
SpringBoot 手动实现动态切换数据源 DynamicSource 上-CSDN博客
在上一篇博客中我带大家手动实现了一个简易版的数据源切换实现方便大家理解数据源切换的原理。今天我们来介绍一个开源的数据源切换框架是baomidou 旗下和 Mybatis-plus 同级的开源框架dynamic-datasource-spring-boot-starter。 1. 简介
dynamic-datasource-spring-boot-starter 是一个基于springboot的快速集成多数据源的启动器。
其支持 Jdk 1.7, SpringBoot 1.5.x 2.x.x 3.x.x。 JPA用户不建议使用JPA自带事务无法连续切库。 2. 使用
下面基于SpringBoot2 做演示。
1.pom.xml
dependencygroupIdcom.baomidou/groupIdartifactIddynamic-datasource-spring-boot-starter/artifactIdversion4.3.1/version
/dependency
2.application.yml
spring:datasource:dynamic:primary: master #设置默认的数据源或者数据源组,默认值即为masterstrict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源datasource:master:url: jdbc:mysql://192.168.183.128:3306/userusername: rootpassword: 123456slave_1:url: jdbc:mysql://192.168.183.128:3307/userusername: rootpassword: 123456slave_2:url: jdbc:mysql://192.168.183.128:3308/userusername: rootpassword: 123456 参数说明 以上会配置一个默认库master一个组slave下有两个子库slave_1,slave_2 后续我们会使用AOP注解的方式指定数据源。 例如DS(master)、DS(slave) 配置文件所有以下划线 _ 分割的数据源 首部 即为组的名称相同组名称的数据源会放在一个组下。切换数据源可以是组名也可以是具体数据源名称。组名则切换时采用负载均衡算法切换。 例如当我们使用DS(slave)时指定了组名 “slave”那么它会采用负载均衡算法自动切换数据源。 因为我们后续希望实现Mysql主从读写分离所有写操作走master数据库所有读操作走slave从数据库。 3. 使用 DS 切换数据源。
Service
public class UserServiceImpl implements UserService {Autowiredprivate UserMapper userMapper;Overridepublic void insert(User user) {userMapper.insert(user);}OverrideDS(slave_1)public ListUser selectAll() {userMapper.selectAll();}OverrideDS(slave)public User selectById(Integer id) {return userMapper.selectById(id);}
} 说明 insert() 方法没有加DS默认使用master数据库。 selectAll() 方法指定使用数据源slave_1 selectById() 使用slave组自动负载均衡查询。 注DS 可以注解在方法上或类上同时存在就近原则 方法上注解 优先于 类上注解。 若要实现Mysql主从自动复制还需要配置mysql主从复制详情参考博客
ShardingSphere5Mysql主从集群搭建、读写分离_shardingsphere mysql读写分离-CSDN博客
其中SpringBoot配置 ShardingSphere5 这一块不用管Mysql主从集群搭建是不变的。
4.其他实现 3. 底层原理
1. SpringBoot自动配置
我们找到 DynamicDataSourceAutoConfiguration.class。 这是框架的自动配置类。 这一段是从我们配置的application.yml 读取并设置相关属性也就是我们配置的数据源信息。
具体的话是赋值给 DynamicRoutingDataSource 这个对象。 2. 扫描DS注解
这是 DynamicDataSourceAnnotationInterceptor 的 invoke 方法典型的AOP。 在所有加了DS的方法上 1. 当执行目标方法的时候会先获取到DS(XXX)中数据源的名称dsKey。 2. 然后再把dsKey 存到ThreadLocal中也就是图中的DynamicDataSourceContextHolder。 3. 最后再开始执行目标方法。 3. DynamicRoutingDataSource
回到我们之前自动配置里说的 DynamicRoutingDataSource 观察 DynamicRoutingDataSource 的继承关系链发现它实现了Spring的 DataSource 和 InitializingBean 接口。 这和我们上一篇博客手动实现数据源切换的思路是一样的。 在 DynamicRoutingDataSource 里determineDataSource 从 ThreadLocal 里 获取到指定数据源名称 最后通过名称返回对应的DataSource数据源。 对比上一篇博客
SpringBoot 手动实现动态切换数据源 DynamicSource 上-CSDN博客
其实思路大差不差只不过 dynamic-datasource-spring-boot-starter 更加完善增加了AOP注解功能。 4. 无注解切换数据源
1. 自定义切面结合 DynamicDatasourceNamedInterceptor 对于所有以 select 方法开头的设置使用 slave 数据源 对于add、update、delete 开头的使用 master 数据源。
2. 自定义 Mybatis 拦截器对于所有的写操作使用 master 数据源所有读操作使用 slave 数据源。即把数据源标识写入 DynamicDataSourceContextHolder 中。
3. 其他场景SaaS多租户系统下每个租户使用独立的数据库那么可以要求前端携带请求头 “dsKey”。配置自定义拦截器拦截请求把dsKey 写入 DynamicDataSourceContextHolder。 今天的分享就到这里。
我是此林关注我吧带你看不一样的世界