Springboot结合@DS配置多少数据源
一、简单说明
@DS注解用于动态数据源切换,用于指定方法或类使用特定的数据源
@DS注解一般来自MyBatis-Plus中的Dynamic DataSource模块,它允许在方法级别进行数据源切换
需要注意下核心的功能:
方法级别的数据源切换:@DS注解可以直接应用在方法上,使该方法在执行时使用指定的数据源
类级别的数据源切换:@DS注解可以应用在类上,使该类中的所有方法在执行时使用指定的数据源
优先级:方法级别的@DS注解优先于类级别的@DS注解
二、使用案例
1.引入依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>4.3.0</version>
</dependency>
2.配置yml
spring:
datasource:
dynamic:
#设置默认的数据源或者数据源组,默认值即为master(就是不适用@DS注解标注时,走的默认数据源)
primary: master
strict: false
datasource:
# 主数据源
master:
url: jdbc:mysql://192.168.111.79:3306/cgdn_business_center?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8
username: root
password: root
initialSize: 5
minIdle: 5
maxActive: 20
maxWait: 60000
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
# 租户ywzthw数据源
ywzthw:
url: jdbc:mysql://192.168.111.79:3306/cgdn_business_center_hw?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8
username: root
password: root
initialSize: 5
minIdle: 5
maxActive: 20
maxWait: 60000
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
3.注意事项
在写代码的时候有两个注意事项:
单机 + 单数据源:@Transactional 注解
单机 + 多数据源:@DSTransactional 注解(新版本支持,旧版本可以使用@Transactional(propagation = Propagation.REQUIRES_NEW))
多机 + 单/多数据源:Seata 分布式事务
4.代码
@Service
@DS("master") //此处不加注解的话,走默认数据源(默认数据源就是你在yml文件通过primary指定的数据源)
@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
public class TemperatureAlarmHistServiceImpl implements ITemperatureAlarmHistService {
@Resource
private TemperatureAlarmHistMapper temperatureAlarmHistMapper;
@DS("ywzthw")
public boolean saveForList(List<TemperatureAlarmHist> temperatureAlarmHistList) {
return temperatureAlarmHistMapper.saveForList(temperatureAlarmHistList);
}
@DS("master") //此处不加注解的话,走当前类指定的数据源
public BcAssignInfo getFistByCaseId() {
BcAssignInfo assignInfo = assignInfoList.get(0);
BcDictUtils.convertDict(assignInfo);
convertCaseItemName(assignInfo);
return assignInfo;
}
}