【资源】
【版本】
- 本文基于Spring Boot 2.7.0
作为Spring boot默认的Datasource,本文是围绕其相关的一些配置学习。
Spring Boot文档:docs.spring.io/spring-boot…
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.jar的DataSourceConfiguration类中:
@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文件:
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