水煮MyBatis(十)- 主流数据源接入

181 阅读2分钟

前言

数据源接口是在JDK里定义的,在我看来,并不是Mybatis关心的内容,它的核心是代理数据库I/O输入输出。当前主流数据源有这么几个:Hikari和、Dbcp、tomcat-jdbc、Druid等,这一章主要介绍Hikari和tomcat-jdbc,这是springboot配置文件中默认支持的两个。
image.png

与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来自日文,字面意思是“光”,可能作者想表达的意思是此组件的查询速度堪比光速吧。
image.png

配置信息

一般如下配置

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

初始化截图:
image.png