依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.5.2</version>
</dependency>
yml配置
datasource:
#动态数据源配置
dynamic:
#主数据源,默认启用
primary: master
datasource:
#数据源1
master:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/maruko?useUnicode=true&characterEncoding=utf-8&useSSL=false
username: root
password: maruko
initial-size: 5
max-active: 10
min-idle: 10
max-wait: 20
#配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
time-between-eviction-runs-millis: 60000
#数据源2
slave:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/maruko2?useUnicode=true&characterEncoding=utf-8&useSSL=false
username: root
password: maruko
initial-size: 5
max-active: 10
min-idle: 10
max-wait: 20
#配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
time-between-eviction-runs-millis: 60000
实现层代码
实现层a方法:
@Override
@DSTransactional
// @Transactional(rollbackFor = Exception.class)
public void dbTest() {
Blog blog = new Blog(7L, "blog", new Date(), 1, 0, false);
baseMapper.insert(blog);
// Maruko maruko = new Maruko(1L, "zjf", 18);
// iMarukoService.save(maruko);
Maruko maruko2 = new Maruko(3L, "zjf", 18);
iMarukoService.save(maruko2);
}
实现层b方法:
@Service
@DS(DbEnum.SLAVE)
public class MarukoServiceImpl extends ServiceImpl<MarukoMapper, Maruko> implements IMarukoService {
@Override
// @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
public boolean save(Maruko maruko) {
return super.save(maruko);
}
}
失效问题
使用动态数据源(@DS)时,@Transactional使用可能会照成@DS失效。
dbTest()方法配置了@Transactional(rollbackFor = Exception.class),save()方法没配置事务,或者配置@Transactional(rollbackFor = Exception.class),会报错save()方法里面的表找不到,其原因感觉应该是aop代理创建事务,没有切换,导致还是使用的默认数据源。解决方法有:第一种去掉事务(不建议),第二种给save()添加事务传播属性@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class),第三种save方法不用添加事务,主方法用@DSTransactional注解。