MyBatis-业务
Mybatis业务
动态数据源
GitHub地址:
文档说明:
基础必读(免费) · dynamic-datasource · 看云 (kancloud.cn)
使用
dynamic-datasource-spring-boot-starter
是 Mybatis-Plus 提供的动态数据源框架,在 Spring Boot 中使用非常方便,可以实现多租户、读写分离等场景下的动态数据源切换。
使用指南:
- 引入依赖
在 pom.xml 中添加如下依赖:
1 |
|
其中 ${mybatis.plus.version}
是 Mybatis-Plus 的版本。
- 配置数据源
在 application.yml
中,按照以下格式配置数据源:
1 |
|
在这里,我们使用了 spring.datasource.dynamic
前缀,表示这是一个动态数据源的配置。其中:
primary
:指定默认数据源的名称。test
和prod
:分别是数据源的名称,可以自定义。
- 配置 Mybatis-Plus
在 Mybatis-Plus 中,使用 DynamicDataSourcePlugin
来配置动态数据源。在 Spring Boot 中使用时,只需要将 DynamicDataSourcePlugin
配置为 Bean 即可:
1 |
|
在这里,我们将 DynamicDataSourcePlugin
注入到 MybatisPlusInterceptor
中,然后将 MybatisPlusInterceptor
配置为 Bean。这样,已经完成了动态数据源的配置。
- 动态切换数据源
在需要切换数据源的方法中,只需要调用 DynamicDataSourceContextHolder
的 setDataSource()
方法,指定要切换的数据源即可。
1 |
|
在上面的代码中,使用 DynamicDataSourceContextHolder.setDataSource("prod")
来切换数据源,然后在使用完之后,使用 DynamicDataSourceContextHolder.clearDataSource()
切回默认数据源。
原理:
DynamicDataSourcePlugin 继承于 Mybatis-Plus 的 Interceptor,并重写了 prepare
和 beforePrepare
等方法。在这些方法中,DynamicDataSourcePlugin 会将当前线程持有的数据源设置到 SqlSession 的 Configuration 中,并在执行完 SQL 后,自动切换回默认数据源。
DynamicDataSourceContextHolder 是数据源上下文的实现类,主要通过 ThreadLocal 来保存、获取当前线程使用的数据源信息。在需要使用时,只需要调用 DynamicDataSourceContextHolder.setDataSource()
即可切换数据源,调用 DynamicDataSourceContextHolder.clearDataSource()
即可切回默认数据源。同时,可以通过 DynamicDataSourceContextHolder.getDataSource()
来获取当前的数据源名称。
DynamicRoutingDataSource 是数据源路由的实现类,主要负责根据数据源名称获取对应的 DataSource。在初始化过程中,会将配置文件中的数据源信息转换为 Dataset 保存起来,然后根据需要来动态获取对应的数据源。在同时存在多个数据源时,可以通过设置不同的负载均衡算法来决定下一次使用哪个数据源。