关于数据库切换的麻烦

背景介绍

现项目使用了两个数据源,分别为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。

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

相关推荐
hexu_blog10 分钟前
vue+java实现图片批量压缩
java·前端·vue.js
头歌实践平台16 分钟前
Hadoop开发环境搭建
java·大数据·hadoop
Seven9739 分钟前
一致性Hash算法:如何实现分布式系统中的高效数据分片?
java
摇滚侠40 分钟前
IDEA 生成 try catch 快捷键
java·ide·intellij-idea
阿旭超级学得完1 小时前
C++11包装器(function和bind)
java·开发语言·c++·算法·哈希算法·散列表
掉鱼的猫2 小时前
Spring AI 2.0 GA 倒计时:先别急,来看看 Java AI 框架的另一条路
java·openai·agent
Refrain_zc2 小时前
Android 应用内 APK 安装全方案:从静默安装到普通安装的详解
java
正儿八经的少年3 小时前
Spring Boot 两种激活配置方式的作用与区别
java·spring boot·后端
云烟成雨TD3 小时前
Spring AI Alibaba 1.x 系列【52】Interrupts 中断机制:节点执行前后静态中断
java·人工智能·spring