项目引入多类数据源依赖,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 ,参考 《多数据源配置问题》

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

相关推荐
浮游本尊12 分钟前
Java学习第21天 - 微服务架构设计
java
渣哥15 分钟前
Java CyclicBarrier 详解:原理、使用方式与应用场景
java
杨杨杨大侠22 分钟前
打开 JVM 黑匣子——走进 Java 字节码(一)
java·jvm·agent
SimonKing23 分钟前
接口调用总失败?试试Spring官方重试框架Spring-Retry
java·后端·程序员
咖啡Beans24 分钟前
SpringCloud网关Gateway功能实现
java·spring cloud
杨杨杨大侠25 分钟前
Atlas Mapper 案例 01:初级开发者 - 电商订单系统开发
java·开源·github
华仔啊25 分钟前
Java 8都出了这么多年,Optional还是没人用?到底卡在哪了?
java
用户0928 分钟前
Gradle Cache Entries 深度探索
android·java·kotlin
叽哥1 小时前
Kotlin学习第 9 课:Kotlin 实战应用:从案例到项目
android·java·kotlin
阿杆2 小时前
同事嫌参数校验太丑,我直接掏出了更优雅的 SpEL Validator
java·spring boot·后端