springboot+mybatis多数据源
首先,既然是多数据源,那么我们就先看下数据源怎么配置的:
javaconfig类似下面这样:

MapperScan注解常用配置如下:
basePackages:Base packages to scan for MyBatis interfaces,也就是mapper接口所在包名
annotationClass:This property specifies the annotation that the scanner will search for,
也就是只扫描指定包下的指定注解作为mapper,通常为org.apache.ibatis.annotations.Mapper
markerInterface:This property specifies the parent that the scanner will search for,只扫描指定包下指定父接口的子接口作为mapper
sqlSessionTemplateRef:指定这组mapper关联的sqlSessionTemplate
sqlSessionFactoryRef:指定这组mapper关联的sqlSessionFactory
那么,问题来了,annotationClass,markerInterface都配置了或者都不配置会怎样?在org.mybatis.spring.annotation.MapperScannerRegistrar.registerBeanDefinitions中调用的org.mybatis.spring.mapper.ClassPathMapperScanner.registerFilters()代码如下:
一幕了然,如果都配置了,最终的mapper会是两者匹配的合集;如果都不配置,那么,最终的mapper会是basePackages下所有任意接口。

使用地方在org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.isCandidateComponent:
还有一个问题,sqlSessionTemplateRef和sqlSessionFactoryRef同时都配置了会怎样?或者不配置呢?
通常,如果只有一个sqlSessionFactory时是不需要配置的,只有容器中有多个时才需要指定一个。
如果都配置了呢?请看下面分析:
org.mybatis.spring.mapper.ClassPathMapperScanner.processBeanDefinitions(Set<BeanDefinitionHolder>)中处理每一个之前扫描mapper生成的BeanDefinition时,会给每一个BeanDefinition设置sqlSessionFactory,如下:

看到log没,很清楚:Cannot use both: sqlSessionTemplate and sqlSessionFactory together. sqlSessionFactory is ignored.
看完mapper的处理,再来看关联的sqlSessionFactory:
根据指定数据源类型利用org.springframework.boot.jdbc.DataSourceBuilder创建dataSource,目前主流的是使用阿里开源的Druid数据库连接池作为数据源:


sqlSessionFactory创建:
通过SqlSessionFactoryBean关联dataSource和MapperXML,再通过@MapperScan关联sqlSessionFactory和mapper接口

至此,单个数据源创建算是完成了。如题,多数据源怎么办?
方法一,手动配置多个dataSource,并在@MapperScan关联不同的sqlSessionFactory和mapper接口。
方法二,动态数据源,继承org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource,重写determineTargetDataSource方法,从targetDataSources中获取对应数据源操作数据库,通常在前面业务代码根据具体怎样的情况选择怎样的dataSource,然后通过设置ThreadLocal变量,这里获取变量信息来返回对应数据源。切入业务逻辑可以通过aop切面从dao层方法名入手,也可以通过mybatis的拦截器获取sql信息和入参决定选择哪个数据源。
PS:如果是读写分离,通常情况下主库读写权限,从库只读权限,事务DataSourceTransactionManager配置在主库的dataSource上,@Transactional会自动从配置事务的dataSource中获取连接。
springboot+mybatis多数据源的更多相关文章
- spring-boot (四) springboot+mybatis多数据源最简解决方案
学习文章来自:http://www.ityouknow.com/spring-boot.html 配置文件 pom包就不贴了比较简单该依赖的就依赖,主要是数据库这边的配置: mybatis.confi ...
- springboot + mybatis + 多数据源
此文已由作者赵计刚薪授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验 在实际开发中,我们一个项目可能会用到多个数据库,通常一个数据库对应一个数据源. 代码结构: 简要原理: 1) ...
- 第九章 springboot + mybatis + 多数据源 (AOP实现)
在第八章 springboot + mybatis + 多数据源代码的基础上,做两点修改 1.ShopDao package com.xxx.firstboot.dao; import org.spr ...
- 【第九章】 springboot + mybatis + 多数据源 (AOP实现)
在第八章 springboot + mybatis + 多数据源代码的基础上,做两点修改 1.ShopDao package com.xxx.firstboot.dao; import org.spr ...
- springboot mybatis 多数据源配置
首先导入mybatis等包,这里就不多说. 下面是配置多数据源和mybatis,每个数据源对应一套mybatis模板 数据源1: package com.aaaaaaa.config.datasour ...
- 第八章 springboot + mybatis + 多数据源(转载)
本篇博客转发自:http://www.cnblogs.com/java-zhao/p/5413845.html 在实际开发中,我们一个项目可能会用到多个数据库,通常一个数据库对应一个数据源. 代码结构 ...
- 【第八章】 springboot + mybatis + 多数据源
在实际开发中,我们一个项目可能会用到多个数据库,通常一个数据库对应一个数据源. 代码结构: 简要原理: 1)DatabaseType列出所有的数据源的key---key 2)DatabaseConte ...
- 第八章 springboot + mybatis + 多数据源2(解决循环引用)
解决了循环引用 1.application.properties #the first datasource jdbc.names:1,2 jdbc1.driverClassName = com.my ...
- spring boot(七):springboot+mybatis多数据源最简解决方案
说起多数据源,一般都来解决那些问题呢,主从模式或者业务比较复杂需要连接不同的分库来支持业务.我们项目是后者的模式,网上找了很多,大都是根据jpa来做多数据源解决方案,要不就是老的spring多数据源解 ...
- SpringBoot ( 七 ) :springboot + mybatis 多数据源最简解决方案
说起多数据源,一般都来解决那些问题呢,主从模式或者业务比较复杂需要连接不同的分库来支持业务.我们项目是后者的模式,网上找了很多,大都是根据jpa来做多数据源解决方案,要不就是老的spring多数据源解 ...
随机推荐
- Bugku-CTF分析篇-中国菜刀(国产神器)
中国菜刀 国产神器
- 线段树+扫描线 NAIPC 2019 Intersecting Rectangles
你看看你有多菜,一点线段树的小小的运用,就不会写了: 题意:如果矩阵有交集,输出1,否则输出0(不包含内嵌): 思路:本题求交集,还得不包括内嵌的情况: 做过一道是求面积的题.跟这道类似,但在这里定义 ...
- mount命令实际操作样例
本篇文章主要介绍了如何在Linux(CentOS 7)命令行模式安装VMware Tools,具有一定的参考价值,感兴趣的小伙伴们可以参考一下. 本例中为在Linux(以CentOS 7为例)安装VM ...
- JS中的解构
先看看数组解构: function fn(){ return [1,2,3]; } var [a,b,c] = fn(); console.log(a,b,c); // 1 2 3 var [d,,f ...
- Python学习之字典集合篇
lambda表达式:起到一个函数速写的作用,允许在代码内嵌入一个函数的定义; filter()函数:1.用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表.2.接收两个参数,第一个为 ...
- 获取表格数据转换为JSON字符串
核心代码JavaScript代码: 方法一 function sc () { var myTable=document.getElementById("myTable"); //获 ...
- HGAME 2020 misc
week1 每日推荐 拿到Wireshark capture file后,按常规思路,用foremost命令拿到一个加密的压缩包,之后文件->导出对象->http,看到最大的一个文件里面最 ...
- 解决VMware Workstation下Win2012R2无法安装Hyper-v问题
有时候我们需要测试Hyper-V但是发现VMware下不能够正常安装,提示:验证过程发现你要安装功能的服务器存在问题.所选功能与所选服务器的当前配置不兼容.无法安装Hyper-V:虚拟机监控程序已在运 ...
- 【代码学习】PYTHON装饰器
一.装饰器 对原代码不修改的基础上完善代码 写代码要遵循开放封闭原则,虽然在这个原则是用的面向对象开发,但是也适用于函数式编程,简单来说,它规定已经实现的功能代码不允许被修改,但可以被扩展,即: 封闭 ...
- 201771010135 杨蓉庆《面对对象程序设计(java)》第十五周学习总结
1.实验目的与要求 (1) 掌握Java应用程序的打包操作: (2) 了解应用程序存储配置信息的两种方法: (3) 掌握基于JNLP协议的java Web Start应用程序的发布方法: (5) 掌握 ...