SpringBoot+Mybatis实现简单的多数据源动态切换(两种方式含项目Gitee代码地址)
创始人
2024-06-02 03:57:28
0

方式一、通过AbstractRoutingDataSource抽象类+AOP+自定义注解 (代码在master分支)

下面只简单说了下实现思路 具体代码就不贴了 自行去下载代码看即可
这种方式方便后期扩展

Gitee代码地址(在master分支) https://gitee.com/deepjava/multiple-data-source.git

实现思路:
先配置好多个数据源注入容器, 在生成connection 对象之前 使用自定义注解动态切换数据源 如果方法上有事务需要同时保证切换数据源操作在开启事务操作之前,这样才能保证数据源成功切换。

注意:数据源切换后的事务问题处理
AOP可以触发数据源字符串的切换,这个没问题数据源真正切换的关键是 AbstractRoutingDataSource 的 determineCurrentLookupKey() 被调用,此方法是在open connection时触发,事务是在connection层面管理的,启用事务后,一个事务内部的connection是复用的,所以就算AOP切了数据源字符串,但是数据源并不会被真正修改

在事务开启后,数据源就不能再进行随意切换了,也就是说,一个事务对应一个数据源。那么传统的Spring管理事务是放在Service业务层操作的,所以更换数据源的操作要放在这个操作之前进行。

有两种方式解决:
方式一:把切换数据源的注解放在Controller层方法上或者把事务注解放到Dao层方法上,不推荐。

方式二:在事务方法外层再套一个方法专门负责切换数据源 并且负责使用代理对象调用事务方法,代码中目前使用这种方式处理,反正也是够奇葩的。 (如果有更好的处理方式 能让自定义注解在 开启事务注解之前执行 请留言 )

方式二、配置多个SqlSessionFactory(代码在type_two分支)

这种方式配置比较简单 用起来也省心 就是每次添加数据源的时候麻烦些
Gitee代码地址(在type_two分支) https://gitee.com/deepjava/multiple-data-source.git

思路: 简单直接, 相当于有几个数据源就加载几个mybatis框架, 通过设置mapper路径 执行对应路径的mapper方法时 就会使用对应的数据源,需要特别注意 默认数据源之外的 数据源 如果要开启事务 一定要使用
@Transactional(transactionManager = “该数据源对应的事务管理器名称”, rollbackFor = Exception.class)

相关内容

热门资讯

»这种符号和》差不多,请问是什... »这种符号和》差不多,请问是什么符号?有没有和《差不多的符号?《 是书名号 有没有相关的符号我就不知...
前五月我国钢铁行业效益提升 供... 记者从中国钢铁工业协会获悉:1—5月,全国粗钢产量4.32亿吨,同比下降1.7%。在利润方面,钢铁行...
现在什么小说最受欢迎啊!玄幻修... 现在什么小说最受欢迎啊!玄幻修真的!给我介绍哈我欲封天,魔天记,完美世界,偷天。仙侠类:修仙狂徒(作...
双塘街道清除城市“牛皮癣” 提... 转自:南京晨报 晨报讯(通讯员 王文杰 南京晨报/爱南京记者 刘通)记者近期从秦淮区双塘街道...
以色列空袭也门胡塞武装控制区 当地时间7日零时前后,以色列对也门西部红海沿岸的胡塞武装控制区发动空袭,目标包括多处港口和关键能源设...
配网改造升级 保障迎峰度夏 转自:贵州日报 “今天任务重,要将原来的裸导线更换为绝缘线,大家注意安全,争取提前送电!”7月2日,...
男生该怎么去喘 男生该怎么去喘我给你写一个针对您的病情的治疗方案,用药调理一个月左右,半个月应该会明显改善。建议您用...
毕业,就当公司合伙人 转自:贵州日报“数智学徒班”搭建农田溯源体系。 贵州日报天眼新闻记者 夏民7月1日8时,毕节职业技术...
护航旅游季食品安全   本报哈尔滨讯(记者刘传江)夏季是黑龙江省伊春市的旅游旺季。为保障游客饮食安全,近日,伊春市市场监...
“口袋体育场馆”惠民生 转自:贵州日报7月6日,玉屏自治县城区一处“口袋体育场馆”,市民正在休闲健身。 近年来,铜仁市玉屏自...