项目引入多类数据源依赖,MyBatisPlus 是如何确定使用哪种数据源的?

背景

看了某项目的 pom.xml 依赖,发现了好几个数据库连接相关的包,有 commons-dbcp2、c3p0、hikaricp、druid-spring-boot-starter,这可是四种不同的数据库连接池呢,一个项目中引入这么多连接池的依赖,MyBatis 是怎么确定使用哪个连接池的数据源呢?

好久没看源码了,猛然一下竟然想不起来了,本文来梳理一下这些连接池及这个疑问。

基础知识

数据库连接及各种工具的依赖关系:

  1. 连接池的种类及效率排序:hikaricp > druid > dbcp2 > c3p0 。
  2. quartz 依赖了 c3p0 和 Hikaricp 两个包。
  3. spring-jdbc 依赖 Hikaricp 。
  4. MyBatisPlus 依赖 spring-jdbc 。
  5. Spring Boot 2 默认的数据库连接池是 Hikaricp 。
  6. Spring 容器注入的 Bean 默认是单例。

数据源的确定流程

首先 ,自动注入 druid 连接池。项目中引入了 druid-spring-boot-starter 依赖后,如果没有自定义数据源,那么它会自动注入一个 DruidDataSource 实例。

其次 ,引入 mybatis-plus-boot-starter 后,它自动注入了 MyBatis 需要的 SqlSessionFactory 。MyBatisPlus 自动注入流程从 MyBatisPlusAutoConfiguration 开始: 自动注入 SqlSessionFactory 类依赖一个 DataSource 对象,而这个对象又由前面的 druid starter 注入了。

所以就确定了 MyBatis 操作数据库使用的连接池的种类就是 DruidDataSource ,此时就是修改 spring.datasource.type 属性为 Hikaricp ,也是不生效的,除非不引入 druid starter 这个自动注入类。

启示录

MyBatis 多数据源本质也是这个流程,针对不同的 DAO 扫描包依赖的 SqlSessionFactory ,配置不同的 DataSource ,参考 《多数据源配置问题》

本文思考的问题还不是属于多数据源的范畴,本质是单数据源类型选择的问题。

相关推荐
java1234_小锋6 小时前
Java高频面试题:Redis的Key和Value的设计原则有哪些?
java·redis·面试
iPadiPhone6 小时前
流量洪峰下的数据守护者:InnoDB MVCC 全实现深度解析
java·数据库·mysql·面试
Nuopiane6 小时前
关于C#/Unity中单例的探讨
java·jvm·c#
win x6 小时前
JVM类加载及双亲委派模型
java·jvm
毕设源码-赖学姐7 小时前
【开题答辩全过程】以 滑雪场租赁管理系统的设计与实现为例,包含答辩的问题和答案
java
Javatutouhouduan7 小时前
SpringBoot整合reids:JSON序列化文件夹操作实录
java·数据库·redis·html·springboot·java编程·java程序员
wen__xvn7 小时前
模拟题刷题3
java·数据结构·算法
bug攻城狮7 小时前
Spring Boot应用内存占用分析与优化
java·jvm·spring boot·后端
無限進步D7 小时前
Java 循环 高级(笔记)
java·笔记·入门
小六溜了7 小时前
模块二十三.网络编程&正则表达式&设计模式
java