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

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

相关推荐
lbb 小魔仙1 分钟前
【Java】Java 实战项目:从零开发一个在线教育平台,附完整部署教程
java·开发语言
正在走向自律2 分钟前
时序数据管理:金仓数据库破局之道
java·后端·struts·时序数据库·金仓kes v9
学编程的小程4 分钟前
告别链接混乱❗️Sun-Panel+cpolar 让 NAS 服务远程一键直达
java·开发语言
青槿吖5 分钟前
【Java集合通关秘籍】从List到Set:解锁无序不重复的集合魔法✨
java·开发语言·算法
do better myself6 分钟前
php导入关键词的脚本 300条分批导入
java·服务器·前端
青云交9 分钟前
Java 大视界 -- Java+Spark 构建离线数据仓库:分层设计与 ETL 开发实战(445)
java·数据仓库·spark·分层设计·java+spark·离线数据仓库·etl 开发
小北方城市网10 分钟前
SpringBoot 集成消息队列实战(RabbitMQ/Kafka):异步通信与解耦,落地高可靠消息传递
java·spring boot·后端·python·kafka·rabbitmq·java-rabbitmq
曹天骄13 分钟前
我是如何用 Cloudflare Worker 实现 HTML 灰度发布与两级缓存的
java·缓存·html
独行soc19 分钟前
2026年渗透测试面试题总结-2(题目+回答)
android·java·网络·python·安全·web安全·渗透测试
爱学java的ptt20 分钟前
AQS简单源码思路和手撕实现
java·网络