HikariCP中常见参数如minimum-idle、maximum-pool-size等具体含义是什么?
摘要:本文从源码角度对 HikariCP 中的一些常见参数进行分析,希望能帮助大家更加清晰地理解这些参数的具体含义。
HikariCP 是目前风头最劲的 JDBC 连接池,号称性能最佳,SpringBoot 2.0 也将 HikariCP 作为默认的数据库连接池。
要想用好 HikariCP,理解常见参数的具体含义至关重要。但是对于某些参数,尽管官方文档给出了详细解释,很多开发、DBA 读完后还是会感到困惑。
因此,本文将从源码角度对 HikariCP 中的一些常见参数进行分析,希望能帮助大家更加清晰地理解这些参数的具体含义。
本文将分析的参数包括:
maximumPoolSize
minimumIdle
connectionTimeout
idleTimeout 及空闲连接的清理逻辑。
maxLifetime
keepaliveTime
connectionTestQuery 及连接有效性检测的实现逻辑。
leakDetectionThreshold
什么时候会检测连接的有效性?
maximumPoolSize
连接池可以创建的最大连接数,包括空闲和活动连接。默认值为 10。
if(maxPoolSize <1) {
maxPoolSize = DEFAULT_POOL_SIZE;
}
如果未显式设置 maxPoolSize,则默认为 -1,此时连接池会使用默认的最大连接数 DEFAULT_POOL_SIZE(10)。
当连接池达到该限制且没有可用的空闲连接时,对新连接的请求(通过getConnection())将会阻塞,最多等待 connectionTimeout 毫秒,然后超时失败。
publicConnectiongetConnection()throwsSQLException
{
returngetConnection(connectionTimeout);
}
publicConnectiongetConnection(finallonghardTimeout)throwsSQLException
{
suspendResumeLock.acquire();
finalvarstartTime = currentTime();
try{
vartimeout = hardTimeout;
do{
varpoolEntry = connectionBag.borrow(timeout, MILLISECONDS);
...
}
minimumIdle
最小空闲连接数。
if(minIdle <0|| minIdle > maxPoolSize) {
minIdle = maxPoolSize;
}
如果未显式设置 minimumIdle,则默认为 -1,此时会取 maximumPoolSize 的值。官方建议不要设置这个参数,让 HikariCP 作为一个固定大小的连接池进行管理。
如果连接池中的空闲连接数低于 minimumIdle,且连接池中的总连接数小于 maximumPoolSize(最大连接数),HikariCP 会调用fillPool方法补充连接。
privatesynchronizedvoidfillPool(finalbooleanisAfterAdd)
{
// 获取当前空闲连接数
finalvaridle = getIdleConnections();
// 检查是否需要创建新连接,创建新连接的条件是总连接数小于 maximumPoolSize 且空闲连接数小于 minimumIdle。
finalvarshouldAdd = getTotalConnections() < config.getMaximumPoolSize() && idle < config.getMinimumIdle();
if(shouldAdd) {
// 计算需要创建的连接数
finalvarcountToAdd = config.getMinimumIdle() - idle;
for(inti =0; i < countToAdd; i++)
addConnectionExecutor.submit(isAfterAdd ? postFillPoolEntryCreator : poolEntryCreator);
}
elseif(isAfterAdd) {
logger.debug("{} - Fill pool skipped, pool has sufficient level or currently being filled.", poolName);
}
}
fillPool会在三种场景下调用:
销毁连接时。
