注解动态切换数据库时,如何处理事务失效(@Transactional / JTA)

来源:互联网 发布:怎么做个软件 编辑:程序博客网 时间:2024/06/16 13:01

【PS】本小白第一次写文章,也没什么技术含量,大家随便转载。。。

框架环境:spring-boot,mybatis(jdbctemplate里面也有说到)

问题描述:突发奇想想弄一个动态切换数据源的东东。于是在网上搜了很多关于配置注解的方式实现动态切换数据源的资料。实现了在service方法上加上一个指定数据源标识的注解就能用该数据源执行数据库操作的功能(说白了也就AbstractRoutingDataSource方式实现的,做个好人,链接给你 https://yq.aliyun.com/articles/8302)。但是发现一个问题,就是我service里如果有A方法,A方法需要调用同样是service层的B,C方法。我需要让B方法访问b数据源,C方法访问c数据源,同时还要支持事务。这样的需求用前面的注解切数据源是不能实现的。会发现怎么搞都只能访问b或者c数据库,不能切换。


解决:


    PS:前置,不要忘了配JTA事务!


    1. jdbctemplate

     这个我没有去实践,喜欢重构jdbctemplate的可以试试,因为能拿到jdbctemplate,所以实际上还是很方便的。无耻地把一篇文章链接复制在这,一共前后两篇,讲的十分清楚:

    http://blog.csdn.net/ErixHao/article/details/52133153

    http://blog.csdn.net/erixhao/article/details/52138760


    2. mybatis

     (我用的mybatis, 我自己反正在网上没找到很好的方法,这个是我试下来能用的方案)

     我原先项目也有用到mybatis多数据源,是配置多个sqlSessionFactory+MapperScannerConfigurer扫描不同包下的mapper文件实现硬切换的烂大街方法。所以我意识到切换数据源不仅仅配置AbstractRoutingDataSource就可以了,如果dao层是mybatis的情况下,还需要mybatis支持。实际上数据库操作还是要落实在sqlSessionFactory上的,而sqlSessionFactory是绑定一个dataSource的,所以只要能够动态切换sqlSessionFactory问题就迎刃而解了。百度一下之后就可以发现很多实现方式(方便懒人,我就再贴一下我参考的文章的链接:http://www.zuidaima.com/shar/1816310397144064.htm,讲的也很清楚)。

     最后的代码拼接工作就教给大家了。如果整套实现只是做成xml配置的话,还是很简单的。不过如果你要想像问题描述里面给的链接的方式那样把一切配置成自动化的也是极好的,用不了几十行代码。


总结:

     本文的价值就是踩在大神的肩膀上把别人的劳动成果穿起来而已,不过对于寻求解决方案的同道来说,还是还是很有参考作用的。唯一重大的缺点就是没呈上完整代码敲打。。。

     有问题留言。





阅读全文
0 0
原创粉丝点击