1. MySQL 中 wait_timeout、interactive_timeout 的影响?
MySQL 中 wait_timeout 与 interactive_timeout 分别是控制什么?它们对连接池里的空闲连接有什么影响?
- 两个超时参数的含义与作用对象
- 对连接池空闲连接被服务端主动断开的影响
- 与连接池保活、validation 的配合
wait_timeout 控制非交互式连接(如 JDBC、ODBC 等程序连接)在空闲超过该秒数后被服务端关闭;interactive_timeout 控制交互式连接(如 mysql 命令行客户端)的空闲超时。两者默认都是 8 小时(28800 秒)。连接池中长时间空闲的连接如果超过 wait_timeout,会被 MySQL 服务端主动断开,但客户端并不感知,直到下次使用该连接发起请求时才会收到 server has gone away 之类的错误。所以连接池必须配合保活(heartbeat/validation query)在空闲连接被服务端断开前主动回收或剔除。
关键在于服务端主动断开早于客户端感知,造成"死连接"(stale connection)被复用。wait_timeout 只针对非交互式连接,因此程序连接池受其影响;过低会导致连接频繁被回收,过高会导致服务端大量空闲连接占用资源。
SHOW VARIABLES LIKE 'wait_timeout';
SHOW VARIABLES LIKE 'interactive_timeout';
SET SESSION wait_timeout = 300;