并发导致数据库连接池 timeout 通常是因为活跃连接数超过池上限或查询耗时过长。优先检查数据库服务端承载能力和慢查询日志,再适当调整连接池的 maximum-pool-size 和 connection-timeout 参数,避免盲目调大池大小拖垮数据库。
先说结论:调整连接池配置前必须确认数据库服务端承载能力,单纯增加客户端池大小可能加剧服务端负载。
- 先定位:监控应用端活跃连接数与数据库端活跃进程数,确认瓶颈在池满还是查询慢。
- 先调整:根据数据库 max_connections 上限,按比例分配给每个应用实例连接池大小。
- 再验证:观察调整后的 timeout 错误频率及数据库 CPU/IO 负载变化。
快速处理思路
大多数 Java 应用使用 HikariCP 作为默认连接池,可通过 application.yml 或 properties 文件调整关键参数。以下配置片段适用于 Spring Boot 项目,需根据实际并发量修改数值。
spring:
datasource:
hikari:
maximum-pool-size: 20
minimum-idle: 5
connection-timeout: 30000
idle-timeout: 600000
max-lifetime: 1800000如果使用的是 Druid 连接池,需配置 max-active、initial-size 和 min-idle 参数,逻辑与 HikariCP 类似。
为什么会这样
连接池 timeout 本质是请求在队列中等待获取连接的时间超过了设定阈值。当并发请求数瞬间激增,所有连接都被占用且未及时释放,新请求就会抛出 GetConnectionTimeout 异常。常见原因包括连接池大小设置过小、数据库服务端处理慢导致连接占用时间长、或存在未关闭的连接泄露。
分步处理
第一步:检查当前连接池监控指标。查看应用监控面板中的 ActiveConnections(活跃连接数)和 IdleConnections(空闲连接数),确认活跃数是否长期接近 maximum-pool-size 设定值。
第二步:确认数据库服务端限制。登录数据库执行查询命令,查看最大允许连接数。MySQL 可使用 SHOW VARIABLES LIKE 'max_connections'; 命令。确保所有应用实例的连接池总和不超过数据库 max_connections 的 80%。
第三步:调整连接池大小。如果数据库有余量,逐步增加 maximum-pool-size,每次增幅不超过 20%。如果数据库已满载,优先优化慢查询而不是增加连接池。
第四步:检查事务粒度。确认代码中是否存在长事务,长事务会长时间占用连接导致池耗尽。将大事务拆分为小事务,确保查询结束后连接及时归还。
怎么验证是否生效
观察应用日志中 ConnectionTimeoutException 或 Cannot acquire connection from pool 错误频率是否下降。通过监控工具检查数据库活跃连接数曲线是否平稳,不再频繁触顶。使用压测工具模拟并发请求,确认在相同并发量下响应时间恢复正常且无超时报错。
常见坑
不要将连接池 maximum-pool-size 设置得大于数据库 max_connections,这会导致数据库拒绝连接。不要将 connection-timeout 设置得过短,否则网络波动会被误判为连接池不足。避免在代码中手动获取连接后忘记关闭,必须使用 try-with-resources 或确保 finally 块中关闭连接。
常见问题
connection-timeout 设置多少合适?
默认 30000 毫秒(30 秒)通常足够,调小无法解决性能问题反而增加报错。只有在网络极不稳定且业务允许快速失败时才考虑调小。
增加连接池大小能解决所有 timeout 吗?
不能,如果是因为慢查询导致连接占用时间过长,增加池大小只会加重数据库负载。必须先优化 SQL 执行计划。
max-lifetime 和 idle-timeout 有什么区别?
max-lifetime 是连接最大存活时间,防止数据库服务端强制关闭旧连接;idle-timeout 是空闲连接保留时间,用于回收资源。max-lifetime 应小于数据库服务端 wait_timeout 设置。
参考来源
- HikariCP GitHub Repository, README Configuration, https://github.com/brettwooldridge/HikariCP
- Spring Boot Official Documentation, DataSource Properties, https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#data.sql.datasource.configuration.hikari
- MySQL Official Documentation, Server System Variables, https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html