Springboot集成mybatisplus多数据源(dynamic)踩坑记录
应为业务需要,所以需要集成多数据源,此处做⼀个记录。
此处使⽤了dynamic-datasource-spring-boot-starter的数据源切换
⼀:引⼊jar包
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.3.0</version>
</dependency>
⼆:配置配置⽂件
spring.datasource.dynamic.primary=master
spring.datasource.dynamic.strict=false
spring.datasource.dynamic.datasource.master.url=jdbc:mysql://:3306/hdt?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&use spring.datasource.dynamic.datasource.master.username=root
spring.datasource.dynamic.datasource.master.password= xxxxxx
spring.datasource.dynamic.datasource.master.sql.cj.jdbc.Driver
spring.datasource.dynamic.datasource.hdt16.url=jdbc:mysql://xxx3306/hdt2?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true spring.datasource.dynamic.datasource.hdt16.username=root
spring.datasource.dynamic.datasource.hdt16.password=123456
spring.datasource.dynamic.datasource.hdt16.sql.cj.jdbc.Driver
spring.datasource.dynamic.primary=master 指定master为默认数据源
spring.datasource.dynamic.strict=false
#严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使⽤默认数据源
当pom⽂件引⼊⽽且配置了数据源。指定了默认数据源。
@Service
public class UpdateLog16ServiceImpl {
@Autowired
private UpdateLogMapper updateLogMapper;
@DS("hdt16")
public boolean save16Log(UpdateLogEntity log) {
return updateLogMapper.addUpdateLog(log);
}
}
使⽤@DS来切换数据源。
切记切记切记
当切换数据源失败的时候:
1:禁⽌使⽤事务注解
原因: spring开启事务后会维护⼀个ConnectionHolder,保证在整个事务下,都是⽤同⼀个数据库连接。请检查整个调⽤链路涉及的类的⽅法和类本⾝还有继承的抽象类上是否有@Transactional注解。
如强烈需要事务保证多个库同时执⾏成功或者失败,请查看事务专栏的解决办法。
2:⽅法内部调⽤
public UserService {
@DS("first")
public void test1() {
// do something
test2();
}
@DS("second")
public void test2() {
// do something
}
}
springboot aop这样切换是不⾏的,底层原理是基于aop去实现,内部⽅法调⽤是不会使⽤aop的
解决⽅法:
把test2()⽅法提到另外⼀个service,单独调⽤。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。