You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:13:47