标准答案

  1. 使用 try-with-resources 或框架边界确保 ResultSet、Statement 和 Connection 在异常路径关闭或归还。
  2. 池大小要结合数据库最大连接、实例数、请求并发和查询耗时设置,不是越大越好。
  3. 设置连接获取超时、空闲回收、最大生命周期和泄漏检测,区分池等待和数据库执行等待。
  4. 慢查询、锁等待和连接泄漏要通过池指标、数据库指标和 trace 关联定位。

题目解析

连接池耗尽可能来自连接泄漏、慢 SQL、锁等待、事务未提交、池上限过小或数据库总容量不足。要把池获取等待和借出后的数据库执行时间分开观察。

连接池大小要按所有实例、后台任务和故障扩容后的总连接预算计算;更大的池不等于更高吞吐,可能让数据库进入锁、CPU 或 I/O 争用。

try-with-resources、连接最大生命周期、获取超时、泄漏检测和坏连接丢弃要覆盖异常、取消和超时路径。池等待超时后应分类失败,而不是无限重试制造连接风暴。

常见误区

  • 误区:连接使用完只 close ResultSet。改正:确保 Statement 和 Connection 也在明确的 owner 边界归还或关闭。
  • 误区:每个实例按数据库最大连接配置。改正:按全局实例数、故障容量和运维预留分配连接。
  • 误区:连接池等待超时后无限重试。改正:限制重试和总 deadline,先定位泄漏、慢查询或下游容量。

作者信息