spring-boot-starter-dynamic-datasource 一个基于springboot的快速集成多数据源的启动器,能够轻易实现 多数据源 动态数据源 主从分离 读写分离 分布式事务
数据源切换方式
1. 动态配置法
配置文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| spring: activiti: datasource: flow datasource: dynamic: strict: true primary: activity datasource: flow: driver-class-name: com.mysql.cj.jdbc.Driver username: ${mysql.username} password: ${mysql.password} url: jdbc:mysql://${mysql.url}/housing_flow?nullCatalogMeansCurrent=true&serverTimezone=GMT%2B8 activity: driver-class-name: com.mysql.cj.jdbc.Driver username: ${mysql.username} password: ${mysql.password} url: jdbc:mysql://${mysql.url}/housing_flow_new?nullCatalogMeansCurrent=true&serverTimezone=GMT%2B8
|
代码配置:
1 2 3 4 5 6 7
| @Service @DS("#this.target.datasource") public class FlowEngineService {
@Value("${spring.activiti.datasource}") public String datasource; }
|
2. 主动获取法
这种方法会在多数据源混用时事务失效
配置文件:
同上
代码配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| @Slf4j @Configuration public class ActivityFlowConfig implements ProcessEngineConfigurationConfigurer {
@Value("${spring.activiti.datasource}") public String datasource;
private final DynamicRoutingDataSource dynamicDataSource;
public ActivityFlowConfig(DynamicRoutingDataSource dataSource) { this.dynamicDataSource = dataSource; }
@Override public void configure(SpringProcessEngineConfiguration processEngineConfiguration) { DataSource dataSource = dynamicDataSource.getDataSource(datasource); processEngineConfiguration.setDataSource(dataSource); } }
|
2. 克隆替换法
完美解决事务失效问题
配置文件:
同上
代码配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| @Slf4j @Configuration public class ActivityFlowConfig implements ProcessEngineConfigurationConfigurer {
@Value("${spring.activiti.datasource}") public String datasource;
private final DynamicRoutingDataSource dynamicDataSource;
public ActivityFlowConfig(DynamicRoutingDataSource dataSource) { this.dynamicDataSource = dataSource; }
@Override public void configure(SpringProcessEngineConfiguration processEngineConfiguration) { DynamicRoutingDataSource dataSource = new DynamicRoutingDataSource(null); dynamicDataSource.getDataSources().forEach(dataSource::addDataSource); dataSource.setPrimary(datasource); processEngineConfiguration.setDataSource(dataSource); } }
|
官网使用方法
- 引入dynamic-datasource-spring-boot-starter。
spring-boot 1.5.x 2.x.x
1 2 3 4 5 6
| <dependency> <groupId>com.baomidou</groupId> <artifactId>dynamic-datasource-spring-boot-starter</artifactId> <version>${version}</version> </dependency>
|
spring-boot3及以上
1 2 3 4 5 6
| <dependency> <groupId>com.baomidou</groupId> <artifactId>dynamic-datasource-spring-boot3-starter</artifactId> <version>${version}</version> </dependency>
|
- 配置数据源。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| spring: datasource: dynamic: enabled: true primary: master strict: false grace-destroy: 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) password: ENC(xxxxx) driver-class-name: com.mysql.jdbc.Driver
|
多主多从:
1 2 3 4 5 6 7 8 9
| spring: datasource: dynamic: datasource: master_1: master_2: slave_1: slave_2: slave_3:
|
纯粹多库:
1 2 3 4 5 6 7 8 9
| spring: datasource: dynamic: datasource: mysql: oracle: sqlserver: postgresql: h2:
|
混合配置:
1 2 3 4 5 6 7 8 9
| spring: datasource: dynamic: datasource: master: slave_1: slave_2: oracle_1: oracle_2:
|
- 使用 @DS 切换数据源。
@DS 可以注解在方法上或类上,同时存在就近原则 方法上注解 优先于 类上注解。
注解 |
结果 |
没有@DS |
默认数据源 |
@DS(“dsName”) |
dsName可以为组名也可以为具体某个库的名称 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| @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"); } }
|