关于数据库切换的麻烦

背景介绍

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

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

相关推荐
光依旧5 分钟前
MCP实战手记系列(二):跑通第一个 MCP Server(文末附github源码链接)
java·spring ai·mcp·ai 开发·源码实战
白远山18 分钟前
上海24小时自助健身房系统软件开发实战指南:从需求到部署
java·架构·uni-app·需求分析
MayBaymax43 分钟前
Spring AI Alibaba Graph 快速上手:黑板、节点、边
java·spring·ai·ai编程
斑鸠喳喳1 小时前
可重入锁 ReentrantLock
java·源码
IT枫斗者枫哥1 小时前
Spring AI 聊天记忆落库:重启后,怎样接上上一轮对话
java
devpotato1 小时前
HashMap 扩容机制:从源码细节到工程实践
java
yueping21 小时前
如何用idea打开jar包
java
IT_Octopus1 小时前
从一个应用开发者的角度,搞懂大数据查询的完整链路
java·大数据·数据库
许彰午1 小时前
51-BpmnDesigner集成
java·低代码·架构
蜗牛互联网1 小时前
Claude放宽生命科学限制:代价是验证、分级和30天留存
java·人工智能·后端