多数据源切换和部分原理解说
MybatisPlus作为mybatis的增强工具,提供了配置多数据源的扩展,通过简单的3步配置,即可使用注解轻松切换数据源。
1. 引入坐标
<!-- dynamic-datasource多数据源坐标-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.6.1</version>
</dependency>
2. 配置数据源
spring:
#mysql 数据源
datasource:
type: com.zaxxer.hikari.HikariDataSource
dynamic:
primary: master # 默认主库名为master
datasource:
master:
driver-class-name: com.mysql.cj.jdbc.Driver
url:jdbc:mysql://xxx.xxx.xxx.xxx:xxx/xxx?xxxxxx
username: xxxxxxx
password: xxxxxxx
secondary:
driver-class-name: com.mysql.cj.jdbc.Driver
url:jdbc:mysql://xxx.xxx.xxx.xxx:xxx/xxx?xxxxxx
username: xxxxxxx
password: xxxxxxx
third:
driver-class-name: com.mysql.cj.jdbc.Driver
url:jdbc:mysql://xxx.xxx.xxx.xxx:xxx/xxx?xxxxxx
username: xxxxxxx
password: xxxxxxx
3. 在方法或者类上使用@DS切换数据源
a. DS注解既可以写在类上,也可以写在方法上,方法上的优先级高于类。
b. 如果没有指定DS的属性值或者没有使用DS注解,就自动走master主库。
通过以上3步,就可以轻松使用切换多数据源的能力了。当然,除了支持主从模式,还支持多主多从、多库,混合模式。
@Service
@DS("secondary")
public class ServiceImpl implements Service {
@Override
public List List() {
// TODO......
return null;
}
@Override
@DS("master")
public List master() {
// TODO......
return null;
}
@Override
@DS("secondary")
public List secondary() {
// TODO......
return null;
}
@Override
@DS("third")
public List third() {
// TODO......
return null;
}
原理探究
- 打开dynamic-datasource-spring-boot-starter.jar包,在spring.factories文件中,可以看到配置了DynamicDataSourceAutoConfiguration启动类。
- 打开DynamicDataSourceAutoConfiguration类,可以看到通过@AutoConfigureBefore注解,提前初始化了MP自己的DataSource数据源。
- 而DataSourceAutoConfiguration类的核心作用就是初始化DataSrouce,MP通过抢先配置的方式,使DataSource变成了自己指定的数据源。
除了初始化MP自己的数据源,DynamicDataSourceAutoConfiguration类还做了一些其他的初始化工作,比如DynamicDataSourceProperties配置,初始化DS注解的切面Advisor等。
初始化工作做完以后,接下来就是根据DS注解判断走哪个数据源了。
- DynamicDataSourceAnnotationInterceptor类是一个方法拦截器,它的invoke里面有判断DS key的操作。
- 在determineDatasourceKey方法中,会调用提前注入DataSourceClassResolver类的findKey方法,判断类或者方法上是否指定了DS注解。
.......
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?