本文是基于Mybatis-plus的多数据源切换

基本约定

  • 本框架专注于数据源切换,不限制具体操作。

  • 配置文件中以下划线 _ 分割的数据源首部为组名。

  • 切换数据源可以是组名或具体数据源名。

  • 默认数据源名为 master,可通过 spring.datasource.dynamic.primary 修改。

  • 方法上的注解优先于类上的注解。

基本使用

1.引入依赖

  • SpringBoot2

<groupId>com.baomidou</groupId>
  <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
  <version>${version}</version>
</dependency>
  • SpringBoot3

<dependency>
  <groupId>com.baomidou</groupId>
  <artifactId>dynamic-datasource-spring-boot3-starter</artifactId>
  <version>${version}</version>
</dependency>

2.配置数据源

spring:
  datasource:
    dynamic:
      primary: master
      strict: false
      datasource:
        master:
          url: jdbc:mysql://xx.xx.xx.xx:3306/dynamic
          username: root
          password: 123456
          driver-class-name: com.mysql.jdbc.Driver
        slave_1:
          url: jdbc:mysql://xx.xx.xx.xx:3307/dynamic
          username: root
          password: 123456
          driver-class-name: com.mysql.jdbc.Driver
        slave_2:
          url: ENC(xxxxx)
          username: ENC(xxxxx) # 使用 ENC() 加密数据库配置信息
          password: ENC(xxxxx)
          driver-class-name: com.mysql.jdbc.Driver

3.使用@DS("slave_1")注解

@DS 可以注解在方法上或类上,同时存在就近原则 方法上注解 优先于 类上注解。

注解位置需要放到service实现类上,或者mapper上(放到接口上不生效)

@Service
@DS("slave")
public class UserServiceImpl implements UserService {

  @Autowired
  private JdbcTemplate jdbcTemplate;

  public List selectAll() {
    return  jdbcTemplate.queryForList("select * from user");
  }
  
  @Override
  @DS("slave_1")
  public List selectByCondition() {
    return  jdbcTemplate.queryForList("select * from user where age >10");
  }
}

跨数据源事务实现

1.使用@DSTransactional注解

2.手动aop实现

@DS("slave_1")注解不生效情况

1.开启了spring事务使用@Transactiona注解

必须放在 @Transactional 注解之前。

在接口上写上了@Transactiona注解

2.方法内部调用

数据源切换是基于AOP代理实现的,内部方法调用不会使用AOP(单独使用一个service层调用其他数据源)