Spring Boot 2中Hikari连接池配置不生效问题排查
我来帮你分析下这个问题——我之前在配置多数据源的时候也踩过一模一样的坑!你的HikariCP属性不生效,核心原因出在手动构建DataSource时没有明确指定HikariDataSource类型,导致Spring无法正确绑定hikari前缀下的嵌套配置属性。
为什么会这样?
Spring Boot 2.x默认确实会用HikariCP作为连接池,但当你调用DataSourceBuilder.create().build()时,如果不指定具体的数据源类型,它可能会创建一个通用的DataSource包装类,而非直接实例化HikariDataSource。这就导致@ConfigurationProperties无法正确识别并注入spring.datasource.hikari.*或者trwbi.datasource.hikari.*下的配置项,最终连接池只能使用默认值(比如maximumPoolSize=10)。
解决方案
你只需要修改两个数据源配置类中的DataSource创建逻辑,明确指定HikariDataSource类型即可,分两种实现方式:
方式一:保留原有前缀,明确指定数据源类型
修改DefaultDbConfig中的defaultDataSource方法:
@Primary @Bean(name = "defaultDataSource") @ConfigurationProperties(prefix = "spring.datasource") public DataSource defaultDataSource() { // 明确指定要创建HikariDataSource实例 return DataSourceBuilder.create() .type(HikariDataSource.class) .build(); }
同样地,为第二个数据源trwbi创建对应的配置类(你目前的代码里只给了默认数据源的配置,需要补充):
@Configuration @EnableTransactionManagement @EnableJpaRepositories( entityManagerFactoryRef = "trwbiEntityManagerFactory", transactionManagerRef = "trwbiTransactionManager", basePackages = { "com.domain.visualisation.trwbi.repository" } // 替换为实际的Repository包路径 ) public class TrwbiDbConfig { @Bean(name = "trwbiDataSource") @ConfigurationProperties(prefix = "trwbi.datasource") public DataSource trwbiDataSource() { return DataSourceBuilder.create() .type(HikariDataSource.class) .build(); } @Bean(name = "trwbiEntityManagerFactory") public LocalContainerEntityManagerFactoryBean trwbiEntityManagerFactory( EntityManagerFactoryBuilder builder, @Qualifier("trwbiDataSource") DataSource dataSource ) { return builder .dataSource(dataSource) .packages("com.domain.visualisation.trwbi.entities") // 替换为实际的Entity包路径 .persistenceUnit("trwbi") .build(); } @Bean(name = "trwbiTransactionManager") public PlatformTransactionManager trwbiTransactionManager( @Qualifier("trwbiEntityManagerFactory") EntityManagerFactory trwbiEntityManagerFactory ) { return new JpaTransactionManager(trwbiEntityManagerFactory); } }
方式二:直接使用HikariDataSourceBuilder(更简洁)
如果你想更直接地绑定Hikari的专属配置,可以改用HikariDataSourceBuilder,此时前缀要改成xxx.datasource.hikari:
@Autowired private Environment env; @Primary @Bean(name = "defaultDataSource") @ConfigurationProperties(prefix = "spring.datasource.hikari") public HikariDataSource defaultDataSource() { // 单独配置基础属性(url、username等) HikariDataSource ds = HikariDataSourceBuilder.create().build(); ds.setJdbcUrl(env.getProperty("spring.datasource.url")); ds.setUsername(env.getProperty("spring.datasource.username")); ds.setPassword(env.getProperty("spring.datasource.password")); ds.setDriverClassName(env.getProperty("spring.datasource.driverClassName")); return ds; }
这种方式适合把Hikari配置和基础数据源配置分开管理,但需要手动注入基础属性,稍微繁琐一点。
验证配置是否生效
修改完成后,你可以在代码中注入HikariDataSource实例,打印配置项验证:
@Autowired @Qualifier("defaultDataSource") private HikariDataSource defaultDataSource; @PostConstruct public void checkHikariConfig() { System.out.println("Maximum Pool Size: " + defaultDataSource.getMaximumPoolSize()); System.out.println("Pool Name: " + defaultDataSource.getPoolName()); System.out.println("Idle Timeout: " + defaultDataSource.getIdleTimeout()); }
启动应用后,控制台就能看到你配置的20(以及其他自定义属性)了。
额外检查点
确保你的项目依赖中确实包含HikariCP(Spring Boot 2.x默认已经引入,但如果是手动移除过的话需要加回来):
- Maven依赖:
<dependency> <groupId>com.zaxxer</groupId> <artifactId>HikariCP</artifactId> <scope>runtime</scope> </dependency>
- Gradle依赖:
runtimeOnly 'com.zaxxer:HikariCP'
内容的提问来源于stack exchange,提问作者SheppardDigital

