空闲连接回收需配置minevictableidletimemillis(推荐300000ms)和maxevictableidletimemillis(推荐1800000ms),并启用心跳验证(如select 1)及maxlifetime(如3600000ms),辅以泄漏检测机制。

空闲连接回收是防止连接失效、避免超时异常的关键配置,核心在于控制连接在池中“躺平”的最长时间,并配合心跳检测确保可用性。
设置空闲连接存活时间
连接池通过两个关键参数决定何时回收空闲连接:
- minEvictableIdleTimeMillis:连接空闲超过该时长后,可能被回收(但会保留至少 minIdle 个连接不清理)
- maxEvictableIdleTimeMillis:连接空闲超过该时长后,一定被回收,不受 minIdle 限制
推荐值:前者设为 5 分钟(300000 毫秒),后者设为 30 分钟(1800000 毫秒)。这样既能及时清理长期不用的连接,又避免频繁抖动。
开启心跳保活机制
仅靠空闲时间回收不够——连接可能在未超时前就被防火墙或数据库主动断开。必须启用心跳验证:
- 设置 keepAlive: true(Druid)或 connectionTestQuery: SELECT 1(HikariCP)
- 配合 validationQuery(Druid)或 connection-test-query(HikariCP),MySQL 用
SELECT 1,Oracle 用SELECT 1 FROM DUAL - 心跳会定期执行该 SQL,失败则立即剔除并重建连接
补充生命周期兜底策略
空闲回收解决“躺着不动”的问题,但还需防范“一直活着却变质”的连接:
- 设置 maxLifetime(如 3600000 毫秒 = 1 小时):无论是否空闲,连接存活超时即强制回收,规避数据库 wait_timeout 或中间设备老化影响
- HikariCP 中需显式配
setConnMaxLifetime;Druid 默认无此参数,需结合 maxEvictableIdleTimeMillis 与 keepAlive 覆盖
注意连接泄漏防护
空闲回收无法挽救持续不归还的连接:
- 开启泄漏检测,如 HikariCP 的 leakDetectionThreshold=60000(60 秒未归还即告警)
- Druid 可配 removeAbandonedOnBorrow=true + removeAbandonedTimeout=60(秒)自动回收疑似泄漏连接
- 根本解法仍是代码中确保
try-with-resources或显式调用close()
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











