@ds实现多数据源切换及解决事务失效问题
生活随笔
收集整理的這篇文章主要介紹了
@ds实现多数据源切换及解决事务失效问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
依賴
<dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>3.5.2</version></dependency>yml配置
datasource:#動態數據源配置dynamic:#主數據源,默認啟用primary: masterdatasource:#數據源1master:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/maruko?useUnicode=true&characterEncoding=utf-8&useSSL=falseusername: rootpassword: marukoinitial-size: 5max-active: 10min-idle: 10max-wait: 20#配置間隔多久才進行一次檢測,檢測需要關閉的空閑連接,單位是毫秒time-between-eviction-runs-millis: 60000#數據源2slave:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/maruko2?useUnicode=true&characterEncoding=utf-8&useSSL=falseusername: rootpassword: marukoinitial-size: 5max-active: 10min-idle: 10max-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注解。
總結
以上是生活随笔為你收集整理的@ds实现多数据源切换及解决事务失效问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 反向安装jar包到本地仓库和清除本地仓库
- 下一篇: 单条视频播放超7000万,网红界“大油田