【问题标题】:Hikari - Spring Boot is ignoring hikari propertiesHikari - Spring Boot 忽略了 hikari 属性
【发布时间】:2019-02-27 11:05:40
【问题描述】:

我有一个 Spring Boot 2 应用程序,它有两个数据源。两个数据源都可以工作,但是我无法更改诸如最大池大小之类的属性,我的更改没有生效。

我在 application.properties 文件中配置我的两个数据源;

spring.datasource.url=jdbc:sqlserver://server;databaseName=ProductionMetrics
spring.datasource.username=ProductionMeusernametricsUser
spring.datasource.password=password
spring.datasource.driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver
spring.datasource.hikari.maximum-pool-size=20

# Products
trwbi.datasource.url=jdbc:sqlserver://server;databaseName=TRWBI
trwbi.datasource.username=username
trwbi.datasource.password=password
trwbi.datasource.driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver
trwbi.datasource.hikari.maximum-pool-size=20

然后,我像这样设置两个数据源;

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
        entityManagerFactoryRef = "defaultEntityManagerFactory",
        transactionManagerRef = "defaultTransactionManager",
        basePackages = {
                "com.domain.visualisation.shared.repository"
        }
)
public class DefaultDbConfig {

    @Primary
    @Bean(name = "defaultDataSource")
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource defaultDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Primary
    @Bean(name = "defaultEntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean
    entityManagerFactory(
            EntityManagerFactoryBuilder builder,
            @Qualifier("defaultDataSource") DataSource dataSource
    ) {
        return builder
                .dataSource(dataSource)
                .packages("com.domain.visualisation.shared.entities")
                .persistenceUnit("default")
                .build();
    }

    @Primary
    @Bean(name = "defaultTransactionManager")
    public PlatformTransactionManager defaultTransactionManager(
            @Qualifier("defaultEntityManagerFactory") EntityManagerFactory defaultEntityManagerFactory
    ) {
        return new JpaTransactionManager(defaultEntityManagerFactory);
    }
}

当我打开 Hikari 的调试时,我可以看到 maximumPoolSize 的值仍然是 10,而不是我定义的值 20。我尝试应用其他属性,例如泄漏检测阈值、池名称和空闲超时,但也没有应用这些属性。

为什么它们没有被应用?

【问题讨论】:

    标签: spring-boot properties-file hikaricp


    【解决方案1】:

    在多个数据源的情况下,并且因为您使用的是 DataSourceBuilder,所以以下工作。

    spring.datasource.maximum-pool-size=20
    trwbi.datasource.maximum-pool-size=20
    

    另外,在您的情况下,我建议关闭自动配置:

    @SpringBootApplication(scanBasePackages = {...},
            exclude = {DataSourceAutoConfiguration.class} )
    @EnableSwagger2
    public class Application {
    ....
    

    如果你不使用构建器,而是使用自动配置,那么使用

    spring.datasource.hikari.minimumIdle=1
    spring.datasource.hikari.maximum-pool-size=3
    

    【讨论】:

    • 什么是默认的最大池大小.. 如果我不配置 hikari 连接池会发生什么?
    • 这对我有用。关键部分是在参数名称中省略 hikari. 关键字。
    【解决方案2】:

    您应该使用属性名称maximumPoolSize

    spring.datasource.hikari.maximumPoolSize=20
    

    最大池大小 此属性控制池允许达到的最大大小,包括空闲和使用中的连接。

    【讨论】:

    • 这是真的,但仅适用于自动配置。此外,spring.datasource.hikari.maximum-pool-size=20,应该可以工作。