SpringBoot+Mybatis实现简单的多数据源动态切换(两种方式含项目Gitee代码地址)

2023-10-29

方式一、通过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)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringBoot+Mybatis实现简单的多数据源动态切换(两种方式含项目Gitee代码地址) 的相关文章

  • 大语言模型产品汇总

    1 OpenAI ChatGPT OpenAI官网 官网地址 https chat openai com chat 目前OpenAI旗下的GPT4 ChatGPT等产品不对中国大陆用户开放 国内用户 想要使用体验的话还是比较困难的 事实上

随机推荐

  • Redis在实际项目中的使用

    redis host 127 0 0 1 port 6379 database 0 pool max idle 20 min idle 1 max active 20 max wait 60000 import org springfram
  • PCB快捷键的设置及推荐

    今天我们来讲解一下 在AD20中PCB快捷键是如何设置的 以及推荐给大家一些常用的快捷键的设置 废话不多说 直接进入主题 快捷键是如何设置的 就拿我们最常用的走线来举例 我们按住Ctrl键 鼠标左键点击走线 出现如下界面 我们可以在可选的下
  • (总结)Oracle 11g常用管理命令(用户、表空间、权限)

    总结 Oracle 11g常用管理命令 用户 表空间 权限 发表于 DataBase Linux Oracle Shell 个人日记 原创总结 作者 谋万世全局者 标签 11g Linux oracle 常用 总结 权限 用户 管理命令 表
  • 分享通过复旦微魔方来找到FM33LG048串口3无法发送和接收原因的例子

    今天来分享一个关于开发国产芯片 复旦微FM33LG048 串口3时候遇到一个无法发送和接收原因 通过使用官网的图形配置工具来成功解决问题的案例 具体情况是这样的 该芯片官网有提供相应的keil参考例子 因为我要用到这个芯片上面的五个串口 所
  • 交叉编译移植 lighttpd fastcgi 以及自己的fastcgi程序

    1 前期准备 安装 arm linux gcc 编译器可能用到指令 vim etc profile 在文件末尾添加 export PATH XXXXX PATH xxxxx 代表安装的交叉编译器的可执行文件的路径 source etc pr
  • 安装openssh-server失败解决

    sudo apt get install openssh server Reading package lists DoneBuilding dependency treeReading state information DoneSome
  • yum安装zabbix包失败问题

    我们使用yum安装zabbix的相关软件包时如果显示安装失败 那么原因基本就是访问外国网址造成的 有效的解决办法就是把zabbix的源换成国内的 vim etc yum repos d zabbix repo zabbix name Zab
  • 实体关系图 (ERD) 指南

    在本指南中了解有关实体关系图 ERD 它们的用途 如何理解它们 如何创建它们等的所有信息 实体关系图 ERD 是一种图表 可让您查看不同实体 例如人员 客户或其他对象 在应用程序或数据库中如何相互关联 它们是在设计新系统时创建的 以便开发团
  • 关于Excel不能显示加载项的问题解决

    20160322 Microsoft 2010版本 Excel不显示加载项 没有截图 点击 文件 gt 选项 gt 加载项 查看应用程序禁用的加载项 将其在下面选项中启用 若启用后还是不成功 软件会显示错误信息 按照信息查找缺失的文件VST
  • ES6中let和const关键字与var关键字之间的区别?

    聚沙成塔 每天进步一点点 专栏简介 变量作用域 Scope 变量提升 Hoisting 重复声明 初始化 全局对象属性 写在最后 专栏简介 前端入门之旅 探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅
  • 环境配置—Cuda和Cudnn版本对应关系

    文章与视频资源多平台更新 微信公众号 知乎 B站 头条 AI研习图书馆 深度学习 大数据 IT编程知识与资源分享 欢迎关注 共同进步 1 Cuda和Cudnn版本对应关系 官网链接 点击打开链接 2 常见版本对应关系 cuDNN Archi
  • HIS、CIS、LIS、EMR、PACS、RIS、CAD以上在医疗行业都是指哪些系统

    HIS Hospital Information System 医院信息管理系统 包含门诊和住院两部分 以药品和收费为主CIS Clinical Information System 临床信息系统 LIS Laboratory Inform
  • QWidget提升后,无法对提升的对象设置背景颜色,QFrame却可以。

    QWidget提升后 不能直接用setStyleSheet 对QWidget这个提升对象的背景颜色和样式做调整了 但是 如果是QFrame 的提升类 却可以用setStyleSheet 对QFrame的提升对象做样式调整 具体现象见下方实列
  • 项目周期性总结(一)

    加入新公司到现在即将三个月 新的项目从筹备分析 到设计开发 经历各种BUG 丛没有一个人试着做一个项目 虽然有BOSS的帮助 但还是会遇到很多各种各样的问题 今天抽空就总结一下 进来的问题与得失 1 项目分析 项目开发中 任何软件开发都必不
  • elasticsearchTemplate 更新数据

    Map
  • Linux 安装nrm报错 require() of ES modules is not supported

    centos7 安装nrm报错 require of ES modules is not supported usr local lib node modules nrm cli js 9 const open require open E
  • ubuntu18 安装jenkins

    1 搭建好jdk环境 2 按照官网走Debian Jenkins Packageshttps pkg jenkins io debian 3 install jenkins报错 Errors were encountered while p
  • 用tf.slim微调vgg模型时遇到的小坑

    首先 我进行微调的时候 代码并非slim提供的train image classifier py 而是自己的代码 我查了slim中的代码 应该是不会出现我文中的问题 我是在微调完inception模型后 修改代码 想要微调vgg 但是出现如
  • 设计模式之单例模式(Singleton)

    单例模式通常用于整个应用只存在一个类的实例的场景 单例模式分为懒汉式与饿汉式 实现的方式可以通过普通的class 也可以通过enum实现 1 饿汉式 对于应用启动后的访问响应时间要求高的应用可以尝试使用 性能消耗主要在创建对象上 单例模式
  • SpringBoot+Mybatis实现简单的多数据源动态切换(两种方式含项目Gitee代码地址)

    方式一 通过AbstractRoutingDataSource抽象类 AOP 自定义注解 代码在master分支 下面只简单说了下实现思路 具体代码就不贴了 自行去下载代码看即可 这种方式方便后期扩展 Gitee代码地址 在master分支