什么是多数据源

多数据源指的是如果一个web项目用到了多个数据库,那么就需要连接多个数据库操作,这就是多数据源。例如:我要查询A数据库(mysql)中的数据进行处理,并将数据插入B数据库中(oracle)。

Dynamic Datasource

Dynamic-Datasource是一款动态数据源的轻量级实现,封装成Spring Starter方式引入,支持Mybatis、MybatisPlus读写分离,支持通过注解动态切换切换数据源。

@DS:指定使用数据库跟配置文件中配置的对应,可以注解在方法上和类上,同时存在方法注解优先于类上注解,强烈建议注解在service实现或mapper接口方法上。

Dynamic Datasource使用

添加Maven依赖

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

配置主数据源和其它数据源并指定数据源名称

spring:
  datasource:
    dynamic:
      # 指定默认数据源
      primary: master
      strict: false
      datasource:
        master:
          driver-class-name: com.mysql.jdbc.Driver
          url: 'jdbc:mysql://127.0.0.1:3306/cicc_report?useSSL=false&useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true'
          username: root
          password: root

        amp:
          driver-class-name: com.mysql.jdbc.Driver
          url: 'jdbc:mysql://127.0.0.1:3306/amp?useSSL=false&useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true'
          username: root
          password: root

        resource:
          driver-class-name: com.mysql.jdbc.Driver
          url: 'jdbc:mysql://127.0.0.1:3306/base_resource?useSSL=false&useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true'
          username: root
          password: root


编写代码中指定该方法使用哪个数据源 默认数据源不需要指定

@DS("amp")
public List<Integer> getHostsByResourceId(List<Integer> list){
    return  resourceHostMapper.getHostsByResourceIds(list);
}
@DS("resource")
public String getHostIp(Integer resourceId) {
   return resourceInstanceMapper.getHostIp(resourceId);
}

如果在代码里面调用了多个数据源的方法,同时需要使用事务的话,spring的声明式事务@Transactional会失效,需要使用@DSTransactional交叉事务。


    @DSTransactional
    public void hostResInfo() {
        List<Integer> hostIds = getHostId();
        if (CollectionUtil.isEmpty(hostIds)){
            return;
        }


        hostIds.stream().forEach(hostId->{
            ReportHostInfo hostInfo = getHostInfo(hostId);
            reportHostInfoService.insertOrUpdate(hostInfo);
        });
    }

07-12 02:02