依然如昨 2021-07-28 13:41 采纳率: 0%
浏览 236

Spring boot+Mybatis Plus利用AOP添加自定义注解切换动态数据源及批量插入insert数据的问题

1、业务上希望能批量插入数据,但是mybatisPlus(MP)只有mapper.insert(entity)单条插入记录的方法,没有批量插入。查了一下要实现ISerive接口里的saveBatcH(List Entity)就可以,所以添加了service和impl,entity和entityMapper也添加。调用saveBatch的时候,问题来了:
(1)数据是往另外一个数据库添加的(别问为什么),用户是在一个master库(默认数据源),另外一个数据存储的是slave库,原先从slave库里获取数据都是在mapper的方法上加上@datasource(datasourceType='要切换的数据源')注解就可以了,可是MP里是一般的CRUD是不需要方法的,咋办?测试了半天,只好在impl里自定义了一个方法,然后方法里调用super.saveBatch,再在方法上加数据源切换注解——貌似终于可以用了,因为不报不认识表名了
(2)但是...又报了一个错误,查了一下说无法返回自增的ID(赋值给entity),可能批量插入开了事务,所以自增的ID无法获取回来,实在不想去看底层逻辑了。
(3)无可奈何,只好换回到循环用单条的insert,怕数据不一致加了@transactional,还是报ID的问题,放弃事务注解,希望数量不大的时候不要出现批量插入的中断,留待过些日子再说
(4)但是,新的问题又出现了,因为原先动态数据源是加在saveBatch那个impl里的方法上的,现在换回到直接mapper.insert里,咋办?注解加在mapper上?没用的,AOP是在方法上做代理的,除非...改AOP?算了,这要是改估计牵涉到一堆问题。
(5)只好又在网上搜看有没有类似的解决方案,看了无数的帖子,终于看到了知道了直接调用DynamicDataSourceContextHolder这个框架自定义类的setDatasource方法就好了——用别人的框架很多东西完全照猫画虎一点都不明白是不行的

2、记录一下这几天调试这个问题的过程,希望大家没事。我看了一下动态数据源切换还可以用dynamic-datasource-spring-boot-starter,还有其他的包也可以。不过原先框架里已经做好了,不想再动了,可能很多人用的方法和我这个差不多,所以记录一下,希望能给一些人带来点帮助。

  • 写回答

1条回答 默认 最新

  • a1767028198 2021-07-28 14:17
    关注

    那就再给你加一个问题:我现在要保证事务,如果在能不引入xa的情况下,怎么让他切换数据源也能保证事务

    评论

报告相同问题?

问题事件

  • 创建了问题 7月28日

悬赏问题

  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 AT89C51控制8位八段数码管显示时钟。
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 下图接收小电路,谁知道原理
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题