springboot + mybatis + 多数据源
此文已由作者赵计刚薪授权网易云社区发布。
欢迎访问网易云社区,了解更多网易技术产品运营经验
在实际开发中,我们一个项目可能会用到多个数据库,通常一个数据库对应一个数据源。
代码结构:
简要原理:
1)DatabaseType列出所有的数据源的key---key
2)DatabaseContextHolder是一个线程安全的DatabaseType容器,并提供了向其中设置和获取DatabaseType的方法
3)DynamicDataSource继承AbstractRoutingDataSource并重写其中的方法determineCurrentLookupKey(),在该方法中使用DatabaseContextHolder获取当前线程的DatabaseType
4)MyBatisConfig中生成2个数据源DataSource的bean---value
5)MyBatisConfig中将1)和4)组成的key-value对写入到DynamicDataSource动态数据源的targetDataSources属性(当然,同时也会设置2个数据源其中的一个为DynamicDataSource的defaultTargetDataSource属性中)
6)将DynamicDataSource作为primary数据源注入到SqlSessionFactory的dataSource属性中去,并且该dataSource作为transactionManager的入参来构造DataSourceTransactionManager
7)使用的时候,在dao层或service层先使用DatabaseContextHolder设置将要使用的数据源key,然后再调用mapper层进行相应的操作,建议放在dao层去做(当然也可以使用spring aop+自定注解去做)
注意:在mapper层进行操作的时候,会先调用determineCurrentLookupKey()方法获取一个数据源(获取数据源:先根据设置去targetDataSources中去找,若没有,则选择defaultTargetDataSource),之后在进行数据库操作。
1、假设有两个数据库,配置如下
application.properties
View Code
说明:在之前的配置的基础上,只增加了上述的第二个数据源。
2、DatabaseType
View Code
作用:列举数据源的key。
3、DatabaseContextHolder
View Code
作用:构建一个DatabaseType容器,并提供了向其中设置和获取DatabaseType的方法
4、DynamicDataSource
View Code
作用:使用DatabaseContextHolder获取当前线程的DatabaseType
5、MyBatisConfig
View Code
作用:
通过读取application.properties文件生成两个数据源(myTestDbDataSource、myTestDb2DataSource)
使用以上生成的两个数据源构造动态数据源dataSource
@Primary:指定在同一个接口有多个实现类可以注入的时候,默认选择哪一个,而不是让@Autowire注解报错(一般用于多数据源的情况下)
@Qualifier:指定名称的注入,当一个接口有多个实现类的时候使用(在本例中,有两个DataSource类型的实例,需要指定名称注入)
@Bean:生成的bean实例的名称是方法名(例如上边的@Qualifier注解中使用的名称是前边两个数据源的方法名,而这两个数据源也是使用@Bean注解进行注入的)
通过动态数据源构造SqlSessionFactory和事务管理器(如果不需要事务,后者可以去掉)
6、使用
ShopMapper:
View Code
ShopDao:
View Code
注意:首先设置了数据源的key,然后调用mapper(在mapper中会首先根据该key从动态数据源中查询出相应的数据源,之后取出连接进行数据库操作)
ShopService:
View Code
ShopController:
View Code
补:其实DatabaseContextHolder和DynamicDataSource完全可以合为一个类
参考:
http://www.cnblogs.com/lzrabbit/p/3750803.html
遗留:在实际开发中,一个dao类只会用到一个数据源,如果dao类中的方法很多的话,每一个方法前边都要添加一个设置数据源的一句话,代码有些冗余,可以使用AOP切面。
具体的实现方式见 第九章 springboot + mybatis + 多数据源 (AOP实现)
很多朋友反映遇到数据源循环依赖的问题,可以试一下将MyBatisConfig中的相关代码换成这样试试
View Code
或者看看评论区已经解决了问题的朋友的方案。
免费领取验证码、内容安全、短信发送、直播点播体验包及云服务器等套餐
更多网易技术、产品、运营经验分享请点击。
相关文章:
【推荐】 交互设计如何为业务赋能——谈谈网易严选企业采购的主页设计
【推荐】 数据分析思路的套路攻略
转载于:https://www.cnblogs.com/163yun/p/10194270.html
springboot + mybatis + 多数据源相关推荐
- 探讨 | SpringBoot + MyBatis 多数据源事物问题
这是小小本周的第二篇,本篇将会着重讲解关于SpringBoot + MyBatis 多数据源的事物的问题. 多数据源 此处模拟创建订单和扣减库存.先创建订单表和库存表 CREATE TABLE `t_ ...
- springboot+mybatis多数据源配置
目录 1.前言 2.多数据源配置 2.1 AbstractRoutingDataSource 2.2.首先maven依赖 2.3 数据源配置 2.4 mybatis配置 2.5 设置数据源的路由ke ...
- springboot(七):springboot+mybatis多数据源最简解决方案
为什么80%的码农都做不了架构师?>>> 说起多数据源,一般都来解决那些问题呢,主从模式或者业务比较复杂需要连接不同的分库来支持业务.我们项目是后者的模式,网上找了很多,大都是 ...
- springboot+mybatis多数据源最简解决方案
说起多数据源,一般都来解决那些问题呢,主从模式或者业务比较复杂需要连接不同的分库来支持业务.我们项目是后者的模式,网上找了很多,大都是根据jpa来做多数据源解决方案,要不就是老的spring多数据源解 ...
- SpringBoot mybatis多数据源配置,记录下我磕磕碰碰的三个月找工作经历
*/ public class DynamicDataSource extends AbstractRoutingDataSource { /** 取得当前使用哪个数据源 @return */ @Ov ...
- SpringBoot Mybatis多数据源配置
参考资料: Spring Boot 2.x基础教程:MyBatis的多数据源配置 目录 一. 配置文件 二. 多数据源配置类 三. 多数据源Mybatis配置 3.1 primary数据源配置 3.2 ...
- 第八章 springboot + mybatis + 多数据源
http://www.cnblogs.com/java-zhao/p/5413845.html 转载于:https://www.cnblogs.com/longshiyVip/p/6123161.ht ...
- SpringBoot+Mybatis配置Druid多数据源
开篇之前,说一句题外话.多数据源和动态数据源的区别. 多数据源,一般用于对接多个业务上独立的数据库(可能异构数据库). 动态数据源,一般用于大型应用对数据切分. 配置参考 如何配置多数据源,网上教程一 ...
- Springboot整合Mybatis多数据源配置
话不多说,直接进入正题.源码地址:https://github.com/SuriYesl/template.git 目录 一.数据库配置文件 二.配置类 主数据源配置类: 次数据源配置类: 三.项目结 ...
- springmvc+mybatis多数据源配置,AOP注解动态切换数据源
springmvc与springboot没多大区别,springboot一个jar包配置几乎包含了所有springmvc,也不需要繁琐的xml配置,springmvc需要配置多种jar包,需要繁琐的x ...
最新文章
- java查找和替换_java敏感字查找和替换
- 好书荐读:阿里达摩院算法专家领衔《深度学习与图像识别:原理与实践》
- android 动态壁纸开发
- 计算机专业课教学,计算机专业课教学的原则和方法
- 7-1 简化的插入排序 (15 分)
- 《Kafka权威指南》读书笔记4 Kafka消费者
- 最新京东批量试用助手
- Scrum 敏捷开发 笔记
- 【问题解决】Ubuntu无法进入图形页面,全屏出现OK,而且屏幕不停闪烁
- 论文阅读:Neural Machine Translation By Jointly Learning To Align And Translate
- Linux源码安装pgadmin4,如何在 Ubuntu 18.04 上安装 pgAdmin4
- 周纪一 威烈王二十三年(戊寅、前403)——摘要
- 重视六大职场面试礼仪
- 中忻嘉业:抖音小店怎样来做
- 小记一次海量数据实时查询域名库设计(上)
- jQuery小游戏——小鸟飞行闪躲
- MFC-CView类总结
- 亚马逊测评项目有哪些风险
- 洛谷——P2862 [USACO06JAN]把牛Corral the Cows
- 如何开发出爆款棋牌游戏app