当前位置: 首页 > news >正文

关于数据库切换的麻烦

背景介绍

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

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

http://www.lryc.cn/news/277399.html

相关文章:

  • Qt/QML编程学习之心得:Linux下读写文件File(24)
  • 【Vue2+3入门到实战】(22)VUE3之组合式API - setup、reactive和ref函数、computed、watch、生命周期函数详细讲解
  • 如何在互联网上找到你想要的数据?
  • 揭秘淘宝商品详情API如何助力电商创新发展
  • vue element plus Space 间距
  • 【驱动序列】C#获取电脑硬件之CPU信息,以及它都有那些品牌
  • 目标检测-One Stage-YOLO v3
  • 安泰ATA-4014高压功率放大器在传感器脉冲涡流检测中的应用
  • Axure全面指南:正确打开并高效使用的步骤!
  • ts axios 指定返回值类型,返回数据类型不确定该怎么办 typescript
  • 判断是否是json字符串
  • SpringBoot集成Minio(接上文)
  • 更新 torchtext 造成的torch版本不匹配的问题
  • flutter资源
  • C++经典程序
  • Java多线程-Thread类的run方法
  • java基础之Java8新特性-方法引入
  • K8S中的hostPort、NodePort 、targetPort、port、containerPort 的区别
  • SpringBoot整合FreeMarker模板引擎
  • 编程基础 - 变量与常量
  • Linux入门攻坚——12、Linux网络属性配置相关知识2
  • 如何自己实现一个分布式事务
  • 使用Nonebot编写QQ机器人
  • 认识SpringBoot中的条件注解
  • 使用PAI-DSW搭建基于LangChain的检索知识库问答机器人
  • 优雅的通过Shell脚本生成Go的程序包
  • 益生菌抗癌?补充这种益生菌,抑制肝癌,还改善肠道健康
  • LLM漫谈(二)| QAnything支持任意格式文件或数据库的本地知识库问答系统
  • Linux环境vscode clang-format格式化:vscode clang format command is not available亲测有效!
  • Vue3前端 响应式数据 知识点