前言
数据源接口是在JDK里定义的,在我看来,并不是Mybatis关心的内容,它的核心是代理数据库I/O输入输出。当前主流数据源有这么几个:Hikari和、Dbcp、tomcat-jdbc、Druid等,这一章主要介绍Hikari和tomcat-jdbc,这是springboot配置文件中默认支持的两个。
与Mybatis的衔接点
原始的JDBC代码中,每次执行数据库指令时,都会去获取数据库链接,这个获取链接的过程,就是与数据源交互的节点。
private void openConnection() throws SQLException {
// 获取数据库链接
this.connection = DataSourceUtils.getConnection(this.dataSource);
this.autoCommit = this.connection.getAutoCommit();
this.isConnectionTransactional = DataSourceUtils.isConnectionTransactional(this.connection, this.dataSource);
}
Hikari数据源
在我目前使用的springboot版本中【springboot-2.6.2】,Hikari是默认的数据源。Hikari来自日文,字面意思是“光”,可能作者想表达的意思是此组件的查询速度堪比光速吧。
配置信息
一般如下配置
spring:
datasource:
url: jdbc:mysql://192.168.1.172:3306/test
username: test
password: 123456
driver-class-name: com.mysql.jdbc.Driver
hikari:
connection-timeout: 2000
minimum-idle: 10
maximum-pool-size: 20
idle-timeout: 1800
虽然在DataSourceConfiguration里写明了需要配置type信息,但其实是不用的,为什么呢?
为什么我是默认数据源?
看下面这个类,在初始化PooledDataSourceConfiguration的时候,基于@Import注解定义,会依次导入以下几个数据源:Hikari、Tomcat、Dbcp2、OracleUcp、Generic。这几个数据源依次初始化,在数据源上面都有一个注解:【@ConditionalOnMissingBean(DataSource.class)】,就是说如果已经存在DataSource的对象,则不能继续创建bean了。所以如果Hikari作为第一顺位,被成功创建之后,剩下的数据源都会被忽略。
public class DataSourceAutoConfiguration {
@Configuration(proxyBeanMethods = false)
@Conditional(PooledDataSourceCondition.class)
@ConditionalOnMissingBean({ DataSource.class, XADataSource.class })
@Import({ DataSourceConfiguration.Hikari.class, DataSourceConfiguration.Tomcat.class,
DataSourceConfiguration.Dbcp2.class, DataSourceConfiguration.OracleUcp.class,
DataSourceConfiguration.Generic.class, DataSourceJmxConfiguration.class })
protected static class PooledDataSourceConfiguration {
}
}
需要注意的是,如果我们在项目中,通过代码创建了其他数据源,比如Druid,则基于@ConditionalOnMissingBean注解的功能,Hikari就不能创建了。
Tomcat数据源
这个数据源是有前置条件的,如下:
/**
* Tomcat Pool DataSource configuration.
*/
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(org.apache.tomcat.jdbc.pool.DataSource.class)
@ConditionalOnMissingBean(DataSource.class)
@ConditionalOnProperty(name = "spring.datasource.type", havingValue = "org.apache.tomcat.jdbc.pool.DataSource",
matchIfMissing = true)
static class Tomcat {
...
}
两个条件:
- 需要存在类依赖:org.apache.tomcat.jdbc.pool.DataSource.class
- 需要配置"spring.datasource.type"属性,且值为 "org.apache.tomcat.jdbc.pool.DataSource"
添加maven依赖
有网友说需要在spring-jdbc-starter里用exclusion标签排除掉Hikari默认数据源,其实是不用的。
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jdbc</artifactId>
<version>10.0.16</version>
</dependency>
配置信息
关键是type的配置,如果没有配置type,那么就算是添加了依赖,最终得到的还是Hikari数据源。
spring:
datasource:
url: jdbc:mysql://192.168.1.172:3306/test
username: test
password: 123456
driver-class-name: com.mysql.jdbc.Driver
type: org.apache.tomcat.jdbc.pool.DataSource
tomcat:
initial-size: 10
min-idle: 10
max-active: 50
初始化截图: