MyBatis-业务

Mybatis业务

动态数据源

GitHub地址:

baomidou/dynamic-datasource-spring-boot-starter: dynamic datasource for springboot 多数据源 动态数据源 主从分离 读写分离 分布式事务 (github.com)

文档说明:

基础必读(免费) · dynamic-datasource · 看云 (kancloud.cn)

使用

dynamic-datasource-spring-boot-starter 是 Mybatis-Plus 提供的动态数据源框架,在 Spring Boot 中使用非常方便,可以实现多租户、读写分离等场景下的动态数据源切换。

使用指南:

  1. 引入依赖

在 pom.xml 中添加如下依赖:

1
2
3
4
5
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>${mybatis.plus.version}</version>
</dependency>

其中 ${mybatis.plus.version} 是 Mybatis-Plus 的版本。

  1. 配置数据源

application.yml 中,按照以下格式配置数据源:

1
2
3
4
5
6
7
8
9
10
11
12
13
spring:
datasource:
dynamic:
primary: test
datasource:
test:
url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&useSSL=false
username: root
password: 123456
prod:
url: jdbc:mysql://localhost:3306/prod?useUnicode=true&characterEncoding=UTF-8&useSSL=false
username: root
password: 123456

在这里,我们使用了 spring.datasource.dynamic 前缀,表示这是一个动态数据源的配置。其中:

  • primary:指定默认数据源的名称。
  • testprod:分别是数据源的名称,可以自定义。
  1. 配置 Mybatis-Plus

在 Mybatis-Plus 中,使用 DynamicDataSourcePlugin 来配置动态数据源。在 Spring Boot 中使用时,只需要将 DynamicDataSourcePlugin 配置为 Bean 即可:

1
2
3
4
5
6
7
8
9
10
11
12
13
@Configuration
public class MybatisPlusConfig {

@Autowired
private DynamicDataSourcePlugin dynamicDataSourcePlugin;

@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(dynamicDataSourcePlugin);
return interceptor;
}
}

在这里,我们将 DynamicDataSourcePlugin 注入到 MybatisPlusInterceptor 中,然后将 MybatisPlusInterceptor 配置为 Bean。这样,已经完成了动态数据源的配置。

  1. 动态切换数据源

在需要切换数据源的方法中,只需要调用 DynamicDataSourceContextHoldersetDataSource() 方法,指定要切换的数据源即可。

1
2
3
4
5
6
7
8
9
10
IService<User> userService;

public void switchDatasource() {
DynamicDataSourceContextHolder.setDataSource("prod"); // 切换到 prod 数据源

User user = userService.getById(1L);
// do something

DynamicDataSourceContextHolder.clearDataSource(); // 切回默认数据源
}

在上面的代码中,使用 DynamicDataSourceContextHolder.setDataSource("prod") 来切换数据源,然后在使用完之后,使用 DynamicDataSourceContextHolder.clearDataSource() 切回默认数据源。

原理:

DynamicDataSourcePlugin 继承于 Mybatis-Plus 的 Interceptor,并重写了 preparebeforePrepare 等方法。在这些方法中,DynamicDataSourcePlugin 会将当前线程持有的数据源设置到 SqlSession 的 Configuration 中,并在执行完 SQL 后,自动切换回默认数据源。

DynamicDataSourceContextHolder 是数据源上下文的实现类,主要通过 ThreadLocal 来保存、获取当前线程使用的数据源信息。在需要使用时,只需要调用 DynamicDataSourceContextHolder.setDataSource() 即可切换数据源,调用 DynamicDataSourceContextHolder.clearDataSource() 即可切回默认数据源。同时,可以通过 DynamicDataSourceContextHolder.getDataSource() 来获取当前的数据源名称。

DynamicRoutingDataSource 是数据源路由的实现类,主要负责根据数据源名称获取对应的 DataSource。在初始化过程中,会将配置文件中的数据源信息转换为 Dataset 保存起来,然后根据需要来动态获取对应的数据源。在同时存在多个数据源时,可以通过设置不同的负载均衡算法来决定下一次使用哪个数据源。


MyBatis-业务
http://example.com/2023/06/01/分布式组件+常见组件/Mybatis业务/
作者
where
发布于
2023年6月1日
许可协议