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会在三种场景下调用: 销毁连接时。
阅读全文