关于数据库切换的麻烦

背景介绍

现项目使用了两个数据源,分别为A、B,两个数据库的数据结构并不相同,数据库A是用来做查询一些基本信息的,数据库B是用来保留业务操作数据的。后端是在mapper层用@DS注解来区分哪些地方用数据库A,而哪些地方用数据库B的。

现在有个新需求,业务新增一个功能,用户可以在界面选择控制模式 ,有两个选项,分别是作战模式和训练模式,而业务需要展示对应模式的数据,也就是说需要新增一个数据库C,用来保留训练模式下的数据,原本的数据库B用来保留作战模式下的数据,但是不管在哪种模式下,数据库A是不需要切换的。

思路

在这个需求之前,原本是用@DS注解来做数据源的切换,然后我就想是否可以使用AOP来实现这个功能,写一个切面,以@DS注解作为切入点,在mybatis执行SQL前判断执行方法所属的对象上面是否有@DS("B")注解,如果有的话,则使用反射修改注解的值为@DS("C")。想着应该是可以的,最后几经波折代码也写出来了,结果却是出乎意外,完全没有效果。

最终解决

上面使用AOP最后并没有实现想要的功能,如果有大佬知道如何用AOP解决此需求,还望赐教。

我后面是使用mybatis拦截器解决的,在mybatis执行方法时,获取方法全路径,并获取SQL语句,然后判断方法全路径是否属于数据源B所属的包(数据源A和B的mapper层在不同的包下面),是的话则在SQL语句要执行的表前面加上数据库C的名字,如select * from table 修改为 select * from C.table。

亲测有效。但始终看着有点别扭,我想肯定还有其它方法,待我好好研究一翻再来更新吧。

相关推荐
gadiaola31 分钟前
【JVM】Java虚拟机(二)——垃圾回收
java·jvm
coderSong25683 小时前
Java高级 |【实验八】springboot 使用Websocket
java·spring boot·后端·websocket
Mr_Air_Boy4 小时前
SpringBoot使用dynamic配置多数据源时使用@Transactional事务在非primary的数据源上遇到的问题
java·spring boot·后端
豆沙沙包?4 小时前
2025年- H77-Lc185--45.跳跃游戏II(贪心)--Java版
java·开发语言·游戏
年老体衰按不动键盘5 小时前
快速部署和启动Vue3项目
java·javascript·vue
咖啡啡不加糖5 小时前
Redis大key产生、排查与优化实践
java·数据库·redis·后端·缓存
liuyang-neu5 小时前
java内存模型JMM
java·开发语言
UFIT5 小时前
NoSQL之redis哨兵
java·前端·算法
刘 大 望5 小时前
数据库-联合查询(内连接外连接),子查询,合并查询
java·数据库·sql·mysql
怀旧,6 小时前
【数据结构】6. 时间与空间复杂度
java·数据结构·算法