Appearance
数据库连接池:容量、等待时间与故障恢复
修订于 2026-10-12。示例用于说明配置方法,不代表本站生产环境或性能测试结果。
连接池复用数据库连接,避免每次请求都重新建立连接。但池子越大不一定越快。并发请求数、每个请求占用连接的时长、数据库可承受的连接数和查询耗时,必须一起考虑。
先算总连接预算
如果有多个应用副本,每个副本都创建连接池,数据库看到的潜在连接上限约为“副本数 × 每副本最大池容量”,还应留出运维、后台任务和其他应用的连接。PostgreSQL 的 max_connections 会影响服务端资源分配;不要只改应用端参数而不评估数据库端限制。
HikariCP 的 maximumPoolSize 包含空闲与正在使用的连接。池满后,申请连接的线程最多等待 connectionTimeout,超时则收到异常。等待不是无限缓冲:如果流量持续超过处理能力,单纯加大等待队列会让请求更慢。
监控与排障
同时看活跃连接、空闲连接、等待连接的请求数、等待时间、获取超时数、事务持续时间和数据库查询延迟。若连接长期占用,应检查慢查询、未结束事务、连接泄漏以及在持有连接时调用外部服务等问题。
容量调整宜一次改变一个因素,在实际负载下验证吞吐、延迟和错误率。池满可能是下游数据库变慢的结果,而不是池容量本身太小。先定位原因,再决定是否扩池、缩短事务、限制入口并发或优化查询。
超时与故障处理
- 获取连接的等待时间应纳入请求整体截止时间,避免外层请求已放弃而内部仍在排队。
- 连接存活时间应与数据库或网络设备的连接回收策略协调;具体值依运行环境确定。
- 数据库故障恢复后,确认旧连接被剔除且新连接可建立;演练连接大量同时重建的情况。
- 不要在数据库提交结果不明确时盲目重试写入,先考虑幂等和事务结果核查。
云代理是否需要
数据库代理可在应用与数据库之间复用连接,但“客户端连接多”不等于“后端连接也会按同样比例减少”。例如 RDS Proxy 的会话固定(pinning)会限制事务级复用。使用代理时应监控后端连接数与固定会话数,并检查会话状态或长事务是否影响复用。