监控报警,应用报错 too many connections,重启应用能好十分钟又满。

先做的是应急:临时调大 max_connections。但这是治标。

查真因:
show processlist 看到大量 Sleep 状态的连接,时间都很长。说明是连接池配置问题,不是慢查询把连接占住了。

应用侧连接池参数:

  • 最大连接数设成了 100,但实例有 8 个 → 最坏 800
  • 空闲连接不回收,idle timeout 设的 30 分钟

调整:

  • 单实例连接池降到 20
  • idle timeout 改 60 秒
  • 加 leak detection,超过 10 秒没归还的打印堆栈

改完连接数稳定在 60 左右。

经验:连接数打满先看 Sleep 占比。Sleep 多 = 池子太大或没回收;Query 多 = 慢查询;两者都有就先解决慢查询。

主楼