dynamic-datasource icon indicating copy to clipboard operation
dynamic-datasource copied to clipboard

使用hikari连接池,部分连接池属性无法生效

Open rayrliang opened this issue 2 years ago • 3 comments

Enviroment

JDK Version(required): JDK1.8

SpringBoot Version(required): 2.1.18.RELEASE

dynamic-datasource-spring-boot-starter Version(required):3.4.0

druid Version(optional):无,使用hikari

hikari Version:3.2.0

Describe what happened

配置yaml

  datasource:
    dynamic:
      primary: a
      strict: false
      datasource:
        a:
          type: com.zaxxer.hikari.HikariDataSource
          driver-class-name: org.postgresql.Driver
          url: jdbc:postgresql://127.0.0.1:5432/a?stringtype=unspecified&binaryTransfer=false
          username: 'root'
          password: '${db_pass}'
          hikari:
            maximum-pool-size: 15
            minimum-idle: 5
            connection-test-query: select 1
        b:
          type: com.zaxxer.hikari.HikariDataSource
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://127.0.0.1:3306/b?characterEncoding=utf8&useSSL=false&useUnicode=true&serverTimezone=GMT%2B8
          username: 'root'
          password: '${db_pass}'
          hikari:
            maximum-pool-size: 15
            minimum-idle: 5
            connection-test-query: select 1

Expected Result: 希望最多的连接池size为15

Actual Result: 实际结果连接池为默认配置10

原因分析

  • Step 1 hikari 源码中,com.zaxxer.hikari.HikariConfig 有属性
private volatile int maxPoolSize;

@Override
public int getMaximumPoolSize()
{
    return maxPoolSize;
}

留意到maxPoolSize与方法getMaximumPoolSize并不完全一致,所以在正常的springboot配置中,应该是使用maximum-pool-size,而不是maxPoolSize,这个应该没异议

  • Step 2 dynamic源码中,com.baomidou.dynamic.datasource.spring.boot.autoconfigure.hikari.HikariCpConfig,留意到
@Data
@Slf4j
public class HikariCpConfig {

    private Integer maxPoolSize;

}

虽然属性名称拷贝过来了,但是实际方法是@Data,即getMaxPoolSize,导致maximum-pool-size失效,而只能使用maxPoolSize

  • Step 3

由于属性名称与期望不一致,导致最终配置失效,使用了默认配置

hikari:
  maximum-pool-size: 15
  minimum-idle: 5
  connection-test-query: select 1

rayrliang avatar Mar 15 '22 02:03 rayrliang

所以你有什么办法解决吗?

huayanYu avatar Mar 15 '22 02:03 huayanYu

所以你有什么办法解决吗?

我建议HikariCpConfig是与hikari官方的写法保持一致,不使用lombok,而是手工getset,

参考

public class HikariConfig implements HikariConfigMXBean

因为实际上最后还是使用springboot的配置。另外,如果单数据源与多数据源的连接参数不一致,容易出现配置错误

rayrliang avatar Mar 15 '22 02:03 rayrliang

欢迎来参与PR

huayanYu avatar Mar 16 '22 12:03 huayanYu

已完成

huayanYu avatar Aug 29 '22 15:08 huayanYu