Spring 同一Servie中切换数据源

离合不骚 发布于 2013/08/21 13:16
阅读 2K+
收藏 1

系统中配置了MASTER和HISTORY两个数据源

先有如下需求

Service层方法a中调用方法b和方法c,方法b使用MASTER数据源,方法c使用HISTORY

现在我在b方法中使用ContextHolder将数据源切到MASTER上 c方法中在切到HISTORY上就不行了,c中还是使用MASTER数据源,请求各位大虾帮我分析下什么原因,是不是Spring事务配置造成的,该如何实现这样的切换,谢谢!

加载中
0
风飞雪
风飞雪

引用来自“Txijin”的答案

引用来自“梅文辉”的答案

把事务去除就可以切换了
那我是不是可以这样理解 只要是在一个事务里就不能实现数据源的切换
刚才翻了下我的开发日志,发现自己原来遇到过这个问题,也是非JTA环境下遇到的,根据记录显然非jta下的多数据源无法保证事务,但可以保证单数据源的事务。把记录的原文贴给你,希望能有帮助,不过描述的内容不一定正确:

可以通过继承AbstractRoutingDataSource实现多数据源动态切换,但是需要注意事务的处理。当使用@Transactional注释时该注释会去getConnection(),如果在这之前没有手动切换数据源则拿到的连接无法确定。所以必须将@Transactional延迟到切换了数据源后再声明,目前的解决方案是:在controller层切换数据源,controller中调用的service方法上声明@Transactional。
0
idreamblue
idreamblue
自己定义一个MultiDataSource 里边选择真正的DataSource 是靠ThreadLocal你设置的 Key即可,你只需来回切换 上下文key 即可,没什么难的。
0
离合不骚

引用来自“idreamblue”的答案

自己定义一个MultiDataSource 里边选择真正的DataSource 是靠ThreadLocal你设置的 Key即可,你只需来回切换 上下文key 即可,没什么难的。

不好意思,问题没说清楚

这样的 单独的调用方法b和c是可以实现切换的,现在的问题是在Service层在方法a中同时调用b好c就不行了

0
光乂木
光乂木
把事务去除就可以切换了
0
离合不骚

引用来自“梅文辉”的答案

把事务去除就可以切换了
那我是不是可以这样理解 只要是在一个事务里就不能实现数据源的切换
风飞雪
风飞雪
如果你配置的是jta事务,当然可以在一个事务里使用多个数据源了,如果不是jta就没研究过spring事务是怎么处理的了。
0
pantrick
pantrick
为啥搞这么复杂
0
金贞花
金贞花
思想有问题
0
光石头
光石头
不需要任何特殊操作,去看下springrain的文档中有关多数据库的说明
返回顶部
顶部