今天小编给大家分享的是Mybatis操作多数据源实现的方法,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获的哦。
现在有一个Mysql数据源和一个Postgresql数据源,使用Mybatis对两个数据源进行操作:可以对两个数据源分别实现其Service层和Mapper层,以及Mybatis的配置类:在配置类中,分别注入了一个事务管理器TransactionManager,这个和事务管理是相关的。在使用@Transactional注解时,需要配置其value属性指定对应的事务管理器。Spring中提供了AbstractRoutingDataSource抽象类,可以用于动态地选择数据源。通过源码可以看到,该抽象类实现了InitializingBean接口,并在其afterPropertiesSet方法中将数据源以
我们先定义两个注解,表示使用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如何求数组中位数”吧! 方法:1、对数组进行排序,并求出数组长度;2、判断数组长度是偶数…