多数据源切换和部分原理解说

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;
    }

原理探究

  1. 打开dynamic-datasource-spring-boot-starter.jar包,在spring.factories文件中,可以看到配置了DynamicDataSourceAutoConfiguration启动类。
  1. 打开DynamicDataSourceAutoConfiguration类,可以看到通过@AutoConfigureBefore注解,提前初始化了MP自己的DataSource数据源。
  1. DataSourceAutoConfiguration类的核心作用就是初始化DataSrouce,MP通过抢先配置的方式,使DataSource变成了自己指定的数据源。

除了初始化MP自己的数据源,DynamicDataSourceAutoConfiguration类还做了一些其他的初始化工作,比如DynamicDataSourceProperties配置,初始化DS注解的切面Advisor等。

初始化工作做完以后,接下来就是根据DS注解判断走哪个数据源了。

  1. DynamicDataSourceAnnotationInterceptor类是一个方法拦截器,它的invoke里面有判断DS key的操作。
  1. determineDatasourceKey方法中,会调用提前注入DataSourceClassResolver类的findKey方法,判断类或者方法上是否指定了DS注解。

.......

posted @   心愿路自平  阅读(65)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示