dynamic-datasource
dynamic-datasource copied to clipboard
使用hikari连接池,部分连接池属性无法生效
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
所以你有什么办法解决吗?
所以你有什么办法解决吗?
我建议HikariCpConfig是与hikari官方的写法保持一致,不使用lombok,而是手工getset,
参考
public class HikariConfig implements HikariConfigMXBean
因为实际上最后还是使用springboot的配置。另外,如果单数据源与多数据源的连接参数不一致,容易出现配置错误
欢迎来参与PR
已完成