标准答案
- 记录池总数、活跃数、空闲数、等待数、借出时间和创建失败,区分没有连接还是连接没有及时归还。
- 把池等待时间与数据库锁、HTTP 响应、消息确认和请求取消关联,找出真正持有连接的慢操作。
- 检查连接超时、空闲回收、最大生命周期、响应体关闭、事务提交和异常释放。
- 池大小要服从下游总连接容量,不能每个实例都按峰值无限放大。
题目解析
连接池耗尽的表象相同,但原因可能是连接泄漏、慢查询、锁等待、远端响应变慢、池上限过小或每个实例配置叠加过量。要记录借出、等待、持有和释放的完整生命周期。
池等待时间应和数据库锁、HTTP 响应、消息确认、请求取消以及连接最大持有时长关联。若连接都在等待下游,增大池只会把并发压力推到更深一层。
连接池大小要按所有实例和故障扩容后的总预算计算,并设置获取超时、最大生命周期、空闲回收和坏连接丢弃。重启可以止血,但必须通过泄漏指标和持有者定位根因。
常见误区
- 误区:看到池等待就调大池。改正:先区分泄漏、慢下游和配置不足,确认数据库或远端仍能承受新增并发。
- 误区:HTTP 响应体未消费或关闭。改正:在所有路径处理响应体,确保连接可以复用或被安全丢弃。
- 误区:连接泄漏只靠重启恢复。改正:记录连接借出栈、持有时长和归还路径,重启只用于临时恢复容量。