0
点赞
收藏
分享

微信扫一扫

DeepSeek 的创新融合:多行业应用实践探索

DT_M 02-18 12:00 阅读 6

大家好,我是此林。

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

<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>4.3.1</version>
</dependency>

2.application.yml

spring:
datasource:
dynamic:
primary: master #设置默认的数据源或者数据源组,默认值即为master
strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
datasource:
master:
url: jdbc:mysql://192.168.183.128:3306/user
username: root
password: 123456
slave_1:
url: jdbc:mysql://192.168.183.128:3307/user
username: root
password: 123456
slave_2:
url: jdbc:mysql://192.168.183.128:3308/user
username: root
password: 123456
  1. 配置文件所有以下划线_分割的数据源首部即为组的名称,相同组名称的数据源会放在一个组下。
  2. 切换数据源可以是组名,也可以是具体数据源名称。组名则切换时采用负载均衡算法切换。

3.使用**@DS**切换数据源。

@Service
public class UserServiceImpl implements UserService {

@Autowired
private UserMapper userMapper;

@Override
public void insert(User user) {
userMapper.insert(user);
}

@Override
@DS("slave_1")
public List<User> selectAll() {
userMapper.selectAll();
}

@Override
@DS("slave")
public User selectById(Integer id) {
return userMapper.selectById(id);
}
}

若要实现Mysql主从自动复制,还需要配置mysql主从复制,详情参考博客:

ShardingSphere5:Mysql主从集群搭建、读写分离_shardingsphere mysql读写分离-CSDN博客

其中SpringBoot配置 ShardingSphere5 这一块不用管,Mysql主从集群搭建是不变的。

4.其他实现

3. 底层原理

1. SpringBoot自动配置

我们找到DynamicDataSourceAutoConfiguration.class。 这是框架的自动配置类。

这一段是从我们配置的application.yml 读取并设置相关属性,也就是我们配置的数据源信息。

具体的话,是赋值给 DynamicRoutingDataSource 这个对象。

2. 扫描@DS注解

这是DynamicDataSourceAnnotationInterceptor 的 invoke 方法,典型的AOP。

3.DynamicRoutingDataSource

回到我们之前自动配置里说的 DynamicRoutingDataSource

在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。

今天的分享就到这里。

我是此林,关注我吧,带你看不一样的世界!

举报

相关推荐

0 条评论