PostgreSQL 压测跑到第 5 分钟,应用报 FATAL: sorry, too many clients already,max_connections 是 200。pg_stat_activity 里有 180 个 idle 连接,全是同一个应用用户。日志里能对上时间点,这种反而好排。

代码里有一处手动 getConnection 的分支没关,异常路径直接 return。压测并发高,泄漏速度被放大,5 分钟就把连接吃光。连接池检测不到这种池外连接,只能等数据库自己拒绝。这一点先确认清楚,后面就不用反复试。

SELECT application_name, state, count(*), max(now()-state_change) AS idle
FROM pg_stat_activity GROUP BY 1,2 ORDER BY 3 DESC;
SHOW max_connections;

这次卡住的地方就在「压测连接数打满」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。

报错里带路径的,先去看那个路径在不在、权限对不对。同一份配置存在多处的,先确认改的是被加载的那一份。

处理上按这个顺序:先按 application_name 统计连接数和状态;找出 idle 时间最长的语句 定位到代码分支;用 try-with-resources 统一关闭 别手写 close;压测期间加一个连接数监控 超 150 就报警。

结果对不对很好判断,压测 30 分钟连接数稳定在 80 以下,不再出现 too many clients。

作者 9823189