应用卡死、超时或cpu飙升时,先查连接池活跃数是否达上限、数据库连接数是否打满、网络是否丢包;再验dns解析、事务未提交、漏close等代码问题;最后核对maximumpoolsize、connectiontimeout等配置是否合理。

编写一份实用的 Java 数据库连接池常见故障排查手册,核心是聚焦真实问题场景、给出可立即验证的操作步骤和关键判断依据,而不是堆砌理论。重点应放在开发者日常遇到的典型症状(如应用卡死、连接超时、CPU飙升)与连接池配置、数据库状态、应用代码三者之间的关联分析上。
识别典型症状并快速归因
先看现象再查原因,避免盲目调参:
- 应用请求大量超时(如 HikariCP 报 “Connection is not available, request timed out after Xms”):优先检查连接池是否耗尽(active connections = maximum pool size)、数据库端连接数是否打满、网络是否丢包;不是立刻加大 maxPoolSize
- 应用启动慢或偶发获取连接慢:关注连接池初始化阶段(initialization fail fast 是否开启)、数据库响应时间(用 telnet 或 nc 测试端口连通性)、DNS 解析是否阻塞(尤其在容器环境)
- 连接池活跃连接数长期为 0 或极低:检查是否所有数据库操作都未正确归还连接(漏写 close()、未用 try-with-resources)、事务未提交/回滚导致连接被 hold 住
- CPU 持续偏高 + 连接池线程频繁创建销毁:可能是 connectionTimeout / validationTimeout 设置过短,导致大量连接反复校验失败并重建;也可能是连接泄漏触发了连接池内部的清理线程高频扫描
关键配置项与风险点对照表
每个参数都要明确“设错后会怎样”,例如:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- maximumPoolSize:设得过大 → 数据库连接数超标,触发 DB 限流或 OOM;设得太小 → 请求排队,吞吐骤降。建议值 ≈ (DB 最大连接数 × 0.7)÷ 应用实例数
- connectionTimeout:默认 30s,若网络不稳定或 DB 响应慢,应适当延长(如 60s),否则大量请求在获取连接阶段就失败
- validationTimeout:必须小于 connectionTimeout,否则校验还没结束连接就被认为超时;推荐设为 3–5s
- leakDetectionThreshold:开发/测试环境务必开启(如 60000ms),能直接打印泄漏堆栈;生产环境慎开(有性能损耗),但可通过监控 activeConnections 持续不降来间接发现
分层诊断流程(从外到内)
按顺序执行,每步有明确验证方式:
-
网络层:用
telnet db-host 3306或nc -zv db-host 5432确认端口可达;用tcpdump抓包看是否有 RST 包(说明连接被中间设备或 DB 主动拒绝) -
数据库层:查
show processlist(MySQL)或pg_stat_activity(PostgreSQL),确认连接数、状态(Sleep/Idle in transaction)、是否有长事务阻塞 -
连接池层:通过 Actuator(Spring Boot)暴露的
/actuator/health或/actuator/metrics查看 active、idle、pending 获取数;HikariCP 可直接调用HikariDataSource.getHikariPoolMXBean()获取实时指标 -
应用代码层:检查所有
Connection/DataSource.getConnection()调用是否包裹在 try-with-resources 中;是否存在手动管理 connection 并忘记 close 的逻辑;是否有 long-running query 占用连接过久
常用工具与命令速查
无需安装复杂组件,用好基础命令就能定位多数问题:
-
JVM 线程快照:
jstack -l <pid> > thread.log</pid>,搜索HikariPool-1 housekeeper或pool-xx-thread看是否卡在 socket read -
连接池运行时状态:Spring Boot Actuator 启用后访问
http://localhost:8080/actuator/metrics/hikaricp.connections.active -
数据库连接数监控:MySQL 执行
SHOW VARIABLES LIKE 'max_connections'; SHOW STATUS LIKE 'Threads_connected'; - 模拟连接泄漏:临时加一段代码只 getConnection() 不 close(),观察 active 连接数是否持续上涨且不回落
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










