【Java】Spring Boot中与HikariCP相关的自动注入以及打印配置信息

801 阅读4分钟

【资源】

【版本】

  • 本文基于Spring Boot 2.7.0

作为Spring boot默认的Datasource,本文是围绕其相关的一些配置学习。

Spring Boot文档:docs.spring.io/spring-boot… image.png

1. Spring Boot 2.0+ 关于Hikari datasource自动注入

Spring boot在引用spring-boot-starter-data-jpa后只要在application.properties中配置spring.datasource.*(如url, username,password等),那么就能直接使用Jpa相关的代码进行数据库操作了。其背后因为Spring Boot利用Autoconfigure自动注入了DataSource bean。

具体位于spring-boot-autoconfigure-2.7.0.jarDataSourceConfiguration类中:

@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(HikariDataSource.class)
@ConditionalOnMissingBean(DataSource.class)
@ConditionalOnProperty(name = "spring.datasource.type", havingValue = "com.zaxxer.hikari.HikariDataSource",
      matchIfMissing = true)
static class Hikari {

   @Bean
   @ConfigurationProperties(prefix = "spring.datasource.hikari")
   HikariDataSource dataSource(DataSourceProperties properties) {
      HikariDataSource dataSource = createDataSource(properties, HikariDataSource.class);
      if (StringUtils.hasText(properties.getName())) {
         dataSource.setPoolName(properties.getName());
      }
      return dataSource;
   }
}

可以看出通过读取spring.datasource.hikari.*配置,生成了类型为HikariDataSource的bean。具体可以配置哪些参数,可以查看spring-boot-autoconfigure-2.7.0.jar包下的META-INF/spring-configuration-metadata.json文件: image.png

2. 打开Hikari相关的Debug日志

2.1 打开HikariConfig Debug日志

HikariCP的配置有一系列的默认值,如maximumPoolSize默认为10等,想要知道应用所有的默认值,可以打开Debug日志:

logging.level.com.zaxxer.hikari.HikariConfig=DEBUG

日志打印例如: 2024-04-05 22:34:43.481 DEBUG 16415 --- [ main] com.zaxxer.hikari.HikariConfig : allowPoolSuspension................................false

完整的日志大概有37行,放第四章。

2.2 打开所有的Hikari日志

有时候为了搞清Hikari连接池的具体情况或是想要看housekeeper线程中的线程数,可以打开所有的Hikari Debug日志:

logging.level.com.zaxxer.hikari=DEBUG

这样就会打印更多的日志,如:

2024-04-06 15:56:12.791 DEBUG 27101 --- [001 housekeeper] com.zaxxer.hikari.pool.HikariPool : test001 - Pool stats (total=10, active=0, idle=10, waiting=0)

3. 自已声明一个HikariDataSource

** 需要注意的是,如果自己声明了DataSource,上述第2章自动注入的DataSource代码就会失效,那么spring.datasource.hikari相关的配置并不会自动被读取。

失效的原因也比较简单,因为不满足@ConditionalOnMissingBean(DataSource.class)这个条件了。

以下是自已声明的HikariDataSource:

@Bean
public DataSource dataSource() {
    HikariDataSource hikariDataSource = new HikariDataSource();
    hikariDataSource.setPoolName("test pool");
    hikariDataSource.setJdbcUrl(url);
    hikariDataSource.setUsername(username);
    hikariDataSource.setPassword(password);
    hikariDataSource.setDriverClassName(driverClassName);
    return hikariDataSource;
}

第4章 完整的DEBUG日志:

2024-04-05 22:34:43.407 DEBUG 16415 --- [           main] com.zaxxer.hikari.HikariConfig           : Driver class com.mysql.jdbc.Driver found in Thread context class loader jdk.internal.loader.ClassLoaders$AppClassLoader@251a69d7
2024-04-05 22:34:43.479 DEBUG 16415 --- [           main] com.zaxxer.hikari.HikariConfig           : HikariPool-1 - configuration:
2024-04-05 22:34:43.481 DEBUG 16415 --- [           main] com.zaxxer.hikari.HikariConfig           : allowPoolSuspension................................false
2024-04-05 22:34:43.481 DEBUG 16415 --- [           main] com.zaxxer.hikari.HikariConfig           : autoCommit................................true
2024-04-05 22:34:43.482 DEBUG 16415 --- [           main] com.zaxxer.hikari.HikariConfig           : catalog................................none
2024-04-05 22:34:43.482 DEBUG 16415 --- [           main] com.zaxxer.hikari.HikariConfig           : connectionInitSql................................none
2024-04-05 22:34:43.482 DEBUG 16415 --- [           main] com.zaxxer.hikari.HikariConfig           : connectionTestQuery................................none
2024-04-05 22:34:43.482 DEBUG 16415 --- [           main] com.zaxxer.hikari.HikariConfig           : connectionTimeout................................30000
2024-04-05 22:34:43.482 DEBUG 16415 --- [           main] com.zaxxer.hikari.HikariConfig           : dataSource................................none
2024-04-05 22:34:43.482 DEBUG 16415 --- [           main] com.zaxxer.hikari.HikariConfig           : dataSourceClassName................................none
2024-04-05 22:34:43.482 DEBUG 16415 --- [           main] com.zaxxer.hikari.HikariConfig           : dataSourceJNDI................................none
2024-04-05 22:34:43.483 DEBUG 16415 --- [           main] com.zaxxer.hikari.HikariConfig           : dataSourceProperties................................{password=<masked>}
2024-04-05 22:34:43.483 DEBUG 16415 --- [           main] com.zaxxer.hikari.HikariConfig           : driverClassName................................"com.mysql.jdbc.Driver"
2024-04-05 22:34:43.483 DEBUG 16415 --- [           main] com.zaxxer.hikari.HikariConfig           : exceptionOverrideClassName................................none
2024-04-05 22:34:43.483 DEBUG 16415 --- [           main] com.zaxxer.hikari.HikariConfig           : healthCheckProperties................................{}
2024-04-05 22:34:43.483 DEBUG 16415 --- [           main] com.zaxxer.hikari.HikariConfig           : healthCheckRegistry................................none
2024-04-05 22:34:43.483 DEBUG 16415 --- [           main] com.zaxxer.hikari.HikariConfig           : idleTimeout................................600000
2024-04-05 22:34:43.484 DEBUG 16415 --- [           main] com.zaxxer.hikari.HikariConfig           : initializationFailTimeout................................1
2024-04-05 22:34:43.484 DEBUG 16415 --- [           main] com.zaxxer.hikari.HikariConfig           : isolateInternalQueries................................false
2024-04-05 22:34:43.484 DEBUG 16415 --- [           main] com.zaxxer.hikari.HikariConfig           : jdbcUrl................................jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8
2024-04-05 22:34:43.484 DEBUG 16415 --- [           main] com.zaxxer.hikari.HikariConfig           : keepaliveTime................................0
2024-04-05 22:34:43.484 DEBUG 16415 --- [           main] com.zaxxer.hikari.HikariConfig           : leakDetectionThreshold................................0
2024-04-05 22:34:43.485 DEBUG 16415 --- [           main] com.zaxxer.hikari.HikariConfig           : maxLifetime................................1800000
2024-04-05 22:34:43.485 DEBUG 16415 --- [           main] com.zaxxer.hikari.HikariConfig           : maximumPoolSize................................10
2024-04-05 22:34:43.485 DEBUG 16415 --- [           main] com.zaxxer.hikari.HikariConfig           : metricRegistry................................none
2024-04-05 22:34:43.485 DEBUG 16415 --- [           main] com.zaxxer.hikari.HikariConfig           : metricsTrackerFactory................................none
2024-04-05 22:34:43.485 DEBUG 16415 --- [           main] com.zaxxer.hikari.HikariConfig           : minimumIdle................................10
2024-04-05 22:34:43.485 DEBUG 16415 --- [           main] com.zaxxer.hikari.HikariConfig           : password................................<masked>
2024-04-05 22:34:43.485 DEBUG 16415 --- [           main] com.zaxxer.hikari.HikariConfig           : poolName................................"HikariPool-1"
2024-04-05 22:34:43.486 DEBUG 16415 --- [           main] com.zaxxer.hikari.HikariConfig           : readOnly................................false
2024-04-05 22:34:43.486 DEBUG 16415 --- [           main] com.zaxxer.hikari.HikariConfig           : registerMbeans................................false
2024-04-05 22:34:43.486 DEBUG 16415 --- [           main] com.zaxxer.hikari.HikariConfig           : scheduledExecutor................................none
2024-04-05 22:34:43.486 DEBUG 16415 --- [           main] com.zaxxer.hikari.HikariConfig           : schema................................none
2024-04-05 22:34:43.486 DEBUG 16415 --- [           main] com.zaxxer.hikari.HikariConfig           : threadFactory................................internal
2024-04-05 22:34:43.486 DEBUG 16415 --- [           main] com.zaxxer.hikari.HikariConfig           : transactionIsolation................................default
2024-04-05 22:34:43.486 DEBUG 16415 --- [           main] com.zaxxer.hikari.HikariConfig           : username................................"test"
2024-04-05 22:34:43.486 DEBUG 16415 --- [           main] com.zaxxer.hikari.HikariConfig           : validationTimeout................................5000