此文已由作者赵计刚薪授权网易云社区发布。

欢迎访问网易云社区,了解更多网易技术产品运营经验

在实际开发中,我们一个项目可能会用到多个数据库,通常一个数据库对应一个数据源。

代码结构:

简要原理:

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 + 多数据源相关推荐

  1. 探讨 | SpringBoot + MyBatis 多数据源事物问题

    这是小小本周的第二篇,本篇将会着重讲解关于SpringBoot + MyBatis 多数据源的事物的问题. 多数据源 此处模拟创建订单和扣减库存.先创建订单表和库存表 CREATE TABLE `t_ ...

  2. springboot+mybatis多数据源配置

    目录 1.前言 2.多数据源配置 2.1  AbstractRoutingDataSource 2.2.首先maven依赖 2.3 数据源配置 2.4 mybatis配置 2.5 设置数据源的路由ke ...

  3. springboot(七):springboot+mybatis多数据源最简解决方案

    为什么80%的码农都做不了架构师?>>>    说起多数据源,一般都来解决那些问题呢,主从模式或者业务比较复杂需要连接不同的分库来支持业务.我们项目是后者的模式,网上找了很多,大都是 ...

  4. springboot+mybatis多数据源最简解决方案

    说起多数据源,一般都来解决那些问题呢,主从模式或者业务比较复杂需要连接不同的分库来支持业务.我们项目是后者的模式,网上找了很多,大都是根据jpa来做多数据源解决方案,要不就是老的spring多数据源解 ...

  5. SpringBoot mybatis多数据源配置,记录下我磕磕碰碰的三个月找工作经历

    */ public class DynamicDataSource extends AbstractRoutingDataSource { /** 取得当前使用哪个数据源 @return */ @Ov ...

  6. SpringBoot Mybatis多数据源配置

    参考资料: Spring Boot 2.x基础教程:MyBatis的多数据源配置 目录 一. 配置文件 二. 多数据源配置类 三. 多数据源Mybatis配置 3.1 primary数据源配置 3.2 ...

  7. 第八章 springboot + mybatis + 多数据源

    http://www.cnblogs.com/java-zhao/p/5413845.html 转载于:https://www.cnblogs.com/longshiyVip/p/6123161.ht ...

  8. SpringBoot+Mybatis配置Druid多数据源

    开篇之前,说一句题外话.多数据源和动态数据源的区别. 多数据源,一般用于对接多个业务上独立的数据库(可能异构数据库). 动态数据源,一般用于大型应用对数据切分. 配置参考 如何配置多数据源,网上教程一 ...

  9. Springboot整合Mybatis多数据源配置

    话不多说,直接进入正题.源码地址:https://github.com/SuriYesl/template.git 目录 一.数据库配置文件 二.配置类 主数据源配置类: 次数据源配置类: 三.项目结 ...

  10. springmvc+mybatis多数据源配置,AOP注解动态切换数据源

    springmvc与springboot没多大区别,springboot一个jar包配置几乎包含了所有springmvc,也不需要繁琐的xml配置,springmvc需要配置多种jar包,需要繁琐的x ...

最新文章

  1. java查找和替换_java敏感字查找和替换
  2. 好书荐读:阿里达摩院算法专家领衔《深度学习与图像识别:原理与实践》
  3. android 动态壁纸开发
  4. 计算机专业课教学,计算机专业课教学的原则和方法
  5. 7-1 简化的插入排序 (15 分)
  6. 《Kafka权威指南》读书笔记4 Kafka消费者
  7. 最新京东批量试用助手
  8. Scrum 敏捷开发 笔记
  9. 【问题解决】Ubuntu无法进入图形页面,全屏出现OK,而且屏幕不停闪烁
  10. 论文阅读:Neural Machine Translation By Jointly Learning To Align And Translate
  11. Linux源码安装pgadmin4,如何在 Ubuntu 18.04 上安装 pgAdmin4
  12. 周纪一 威烈王二十三年(戊寅、前403)——摘要
  13. 重视六大职场面试礼仪
  14. 中忻嘉业:抖音小店怎样来做
  15. 小记一次海量数据实时查询域名库设计(上)
  16. jQuery小游戏——小鸟飞行闪躲
  17. MFC-CView类总结
  18. 亚马逊测评项目有哪些风险
  19. 洛谷——P2862 [USACO06JAN]把牛Corral the Cows
  20. 如何开发出爆款棋牌游戏app

热门文章

  1. InDesign入门教程,如何链接图形?
  2. 如何在恢复模式下启动 Mac?
  3. 如何关闭来自苹果的个性化广告?
  4. Microsoft 365 for Mac(原Office 365)
  5. js基础——function类型
  6. ASP(从前) vs ASP.NET(之后)
  7. 【Java6学习笔记】多线程编程中使用volatile保障原子性
  8. tomcat7简单优化
  9. 京东电商广告和推荐的机器学习系统实践
  10. js操作select(添加、移除、获取select值)