本文是基于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层调用其他数据源)