高峰时接口报 HikariPool-1 - Connection is not available request timed out after 30000ms,30 个连接全被占着。碰到这种情况,我一般先确认改动有没有真的生效。

原因不复杂,连接被长事务或没关闭的流占住,池里没有空闲连接,请求只能在 connectionTimeout 里干等。

「Hikari 获取连接」这类改动最怕改一半,回滚脚本先准备好,再动生产。日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。

spring.datasource.hikari.maximum-pool-size=30
spring.datasource.hikari.connection-timeout=3000
spring.datasource.hikari.leak-detection-threshold=20000

权限不要一口气开到最大,先加到够用再往上试,范围小才好收。把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。

改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。

能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。

具体做法是,抓线程栈看谁占着连接不放;把 connectionTimeout 调短快速失败;检查事务范围有没有包住远程调用。

最后用这个标准收尾,压测时不再出现获取连接超时,活跃连接数回落到 10 以内。

作者 9823189