背景
看了某项目的 pom.xml 依赖,发现了好几个数据库连接相关的包,有 commons-dbcp2、c3p0、hikaricp、druid-spring-boot-starter,这可是四种不同的数据库连接池呢,一个项目中引入这么多连接池的依赖,MyBatis 是怎么确定使用哪个连接池的数据源呢?
好久没看源码了,猛然一下竟然想不起来了,本文来梳理一下这些连接池及这个疑问。
基础知识
数据库连接及各种工具的依赖关系:
- 连接池的种类及效率排序:hikaricp > druid > dbcp2 > c3p0 。
- quartz 依赖了 c3p0 和 Hikaricp 两个包。
- spring-jdbc 依赖 Hikaricp 。
- MyBatisPlus 依赖 spring-jdbc 。
- Spring Boot 2 默认的数据库连接池是 Hikaricp 。
- 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 ,参考 《多数据源配置问题》。
本文思考的问题还不是属于多数据源的范畴,本质是单数据源类型选择的问题。