Spring MVC 多数据源,配置完事务之后就不能正常切换数据源,求大神指点 3C

两张附图事务没配置的时候数据源切换正常,加上事务之后就一直显示的是默认连接的数据源,
这是为什么啊??百思不得其解,,求神哥神姐解惑啊
数据源
红框里边的是我配置的事务

这个是数据源切换代码
数据源切换代码
切换的时候就是 每次在掉底层方法之前先设置下数据库 向下面这样

MultipleDataSource.setDataSourceKey("yz_dataSource");
MultipleDataSource.setDataSourceKey("news_dataSource");

8个回答

我也遇到了这个问题,仔细debug了一下,结论如下:
1. AOP可以触发数据源字符串的切换,这个没问题
2. 数据源真正切换的关键是 AbstractRoutingDataSource 的 determineCurrentLookupKey() **被调用,此方法是在open connection**时触发
3. 事务是在connection层面管理的,启用事务后,一个事务内部的connection是复用的,所以就算AOP切了数据源字符串,但是数据源并不会被真正修改

综上所述:
如果要使用事务,还是别用determineCurrentLookupKey()这种方法切数据源了,得配置多个才行

nmgrd
lhever_ 楼上给出了这样一个结论:我也遇到了这个问题,仔细debug了一下,结论如下: 1. AOP可以触发数据源字符串的切换,这个没问题 2. 数据源真正切换的关键是 AbstractRoutingDataSource 的 determineCurrentLookupKey() **被调用,此方法是在open connection**时触发 3. 事务是在connection层面管理的,启用事务后,一个事务内部的connection是复用的,所以就算AOP切了数据源字符串,但是数据源并不会被真正修改 综上所述: 如果要使用事务,还是别用determineCurrentLookupKey()这种方法切数据源了,得配置多个才行。 事实上可以通过@Order注解调整AOP的顺序,保证AOP切换数据源的动作在determineCurrentLookupKey方法之前先调用就可以
大约 2 年之前 回复
nmgrd
lhever_ 我也遇到了这个问题,仔细debug了一下,结论如下: 1. AOP可以触发数据源字符串的切换,这个没问题 2. 数据源真正切换的关键是 AbstractRoutingDataSource 的 determineCurrentLookupKey() **被调用,此方法是在open connection**时触发 3. 事务是在connection层面管理的,启用事务后,一个事务内部的connection是复用的,所以就算AOP切了数据源字符串,但是数据源并不会被真正修改 综上所述: 如果要使用事务,还是别用determineCurrentLookupKey()这种方法切数据源了,得配置多个才行
大约 2 年之前 回复
nmgrd
lhever_ 楼上给出了这样一个结论:
大约 2 年之前 回复
Xgx120413
Cansluck 你好,要怎么配置啊??
2 年多之前 回复

把数据源切换代码贴出来,你用spring声明式的事务,它是绑定线程的,也不知道你切换是什么模式,不行自己手工写编程式的事务,也不难,不过aop要自己写罢了

还有,spring的事务是在切点中,会判断当前线程是否有事务,没有则会将数据源注入事务然后用threadload存起来,按照你这样的配置,事务始终也只会对当前数据源有效,当你切换数据源要么你自己也在spring的事务内同时也换数据源,不过这又要自己提交原来的事务!得不偿失,更麻烦!我是用spring编程式的事务实现的,事务自己管理,爱怎么换就怎么换

sinat_19351993
哈哈书架 我把那个代码贴出来了你看下
5 年多之前 回复

@tinweisog

数据源切换代码

切换的时候就是 每次在掉底层方法之前先设置下数据库 向下面这样

MultipleDataSource.setDataSourceKey("yz_dataSource");

MultipleDataSource.setDataSourceKey("news_dataSource");

哥们,遇到和你一样的问题了,如果你解决了,麻烦你和我说一下,谢谢了 1127653664

你如果事务是在service层,那么你切换数据源要在service之前切换,你如果在service里面是不能切换成功的

事物的情况下,手动切换determineTargetDataSource即可,解决只换名称而不换DataSource的问题

u012942817
时光微凉_岁月清浅 怎么个解决方案?可否指导下
9 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐