分享更有价值
被信任是一种快乐

Mybatis操作多数据源实现的方法

文章页正文上

今天小编给大家分享的是Mybatis操作多数据源实现的方法,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获的哦。
现在有一个Mysql数据源和一个Postgresql数据源,使用Mybatis对两个数据源进行操作:可以对两个数据源分别实现其Service层和Mapper层,以及Mybatis的配置类:在配置类中,分别注入了一个事务管理器TransactionManager,这个和事务管理是相关的。在使用@Transactional注解时,需要配置其value属性指定对应的事务管理器。Spring中提供了AbstractRoutingDataSource抽象类,可以用于动态地选择数据源。通过源码可以看到,该抽象类实现了InitializingBean接口,并在其afterPropertiesSet方法中将数据源以的形式放入一个Map中。该类中还有一个determineTargetDataSource方法,是根据lookupkey从Map中获取对应的数据源,如果没有获取到,则使用默认的数据源。lookupkey是通过determineTargetDataSource方法获取到的,而它是一个抽象方法,我们要做的就是通过实现这个方法,来控制获取到的数据源。创建AbstractRoutingDataSource的子类,实现determineCurrentLookupKey方法这里的DataSourceContextHolder是一个操作ThreadLocal对象的工具类通过调用DataSourceContextHolder.mysql()或者DataSourceContextHolder.postgresql()就能修改contextHolder的值,从而在动态数据源的determineTargetDataSource方法中就能获取到对应的数据源。在数据源配置类中,将mysql和postgresql的数据源设置到动态数据源的Map中,并注入容器。由于使用了动态数据源,所以只需要编写一个配置类即可。我们虽然可以使用DataSourceContextHolder类中的方法进行动态数据源切换,但是这种方式有些繁琐,不够优雅。可以考虑使用注解的形式简化数据源切换。
我们先定义两个注解,表示使用Mysql数据源或Postgresql数据源:再定义一个切面,免费云主机、域名当使用了注解时,会先调用切换数据源的方法,再执行后续逻辑。在使用动态数据源的事务操作时有两个需要注意的问题:问题一同一个事务操作两个数据源Mybatis使用Executor执行SQL时需要获取连接,BaseExecutor类中的getConnection方法调用了SpringManagedTransaction中的getConnection方法,这里优先从connection字段获取连接,如果connection为空,才会调用openConnection方法,并把连接赋给connection字段。也就是说,如果你使用的是同一个事务来操作两个数据源,那拿到的都是同一个连接,会导致数据源切换失败。问题二两个独立事务分别操作两个数据源(1) 在开启事务的时候,DataSourceTransactionManager中的doBegin方法会先获取Connection,并保存到ConnectionHolder中,将数据源和ConnectionHolder的对应关系绑定到TransactionSynchronizationManager中。(2) TransactionSynchronizationManager的bindResource方法将数据源和ConnectionHolder的对应关系存入线程变量resources中。(3) 上边提到的openConnection方法,其实最终也是从TransactionSynchronizationManager的resources中获取连接的也就是说,如果修改了数据源,那么resources中就找不到对应的连接,就可以重新获取连接,从而达到切换数据源的目的。然而我们数据源的只有一个,就是动态数据源,因此即使使用两个独立事务,也不能成功切换数据源。如果想要使用动态数据源的事务处理,可能需要考虑使用多线程分布式的事务处理机制;
如果使用直接注入多个数据源的方式实现事务处理,实现简单,但是各数据源事务是独立的;
应该根据具体情况进行选择。关于Mybatis操作多数据源实现的方法就分享到这里了,希望以上内容可以对大家有一定的参考价值,可以学以致用。如果喜欢本篇文章,不妨把它分享出去让更多的人看到。

相关推荐: JavaScript如何求数组中位数

这篇文章主要讲解了“JavaScript如何求数组中位数”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript如何求数组中位数”吧! 方法:1、对数组进行排序,并求出数组长度;2、判断数组长度是偶数…

文章页内容下
赞(0) 打赏
版权声明:本站采用知识共享、学习交流,不允许用于商业用途;文章由发布者自行承担一切责任,与本站无关。
文章页正文下
文章页评论上

云服务器、web空间可免费试用

宝塔面板主机、支持php,mysql等,SSL部署;安全高速企业专供99.999%稳定,另有高防主机、不限制内容等类型,具体可咨询QQ:360163164,Tel同微信:18905205712

主机选购导航云服务器试用

登录

找回密码

注册