mysql会话空闲超时断开须同步调整wait_timeout与interactive_timeout、匹配连接池maxlifetime等参数并禁用autoreconnect=true;需先查实际值(select @@wait_timeout, @@interactive_timeout),再永久修改my.cnf中[mysqld]段并重启,否则无效。

MySQL 会话空闲超时断开不能只靠 wait_timeout 单独生效,必须同步确认连接类型、匹配连接池生命周期,并禁用 autoReconnect=true —— 否则改了也白改,照样报 MySQL server has gone away。
查清当前生效的 wait_timeout 和 interactive_timeout 值
不同环境实际值差异极大:云数据库常设为 300 秒,Docker 官方镜像默认 28800 秒,某些 PHP 环境甚至设成 60 秒。不查就调等于蒙眼操作。
- 连上 MySQL 执行:
SELECT @@wait_timeout, @@interactive_timeout;—— 注意单位是秒,且返回的是会话级值 - 要查全局值,得用:
SHOW GLOBAL VARIABLES LIKE 'wait_timeout';和SHOW GLOBAL VARIABLES LIKE 'interactive_timeout'; - 如果两个值不等,说明服务端行为已分裂,后续排查会绕弯子;JDBC 默认走
wait_timeout,但部分连接池(如 Druid)显式声明CLIENT_INTERACTIVE时会受interactive_timeout影响
永久修改 my.cnf 并重启 mysqld,别信 SET GLOBAL
SET GLOBAL wait_timeout = 300 是临时的,MySQL 一重启就回滚,且新连接是否继承还取决于配置文件读取顺序。生产环境必须落盘。
- Linux/macOS 下编辑
/etc/my.cnf或/etc/mysql/my.cnf;Windows 下是my.ini - 只在
[mysqld]段落下加两行:wait_timeout = 300和interactive_timeout = 300 - 删掉
[client]段里的同名配置 —— 那只是给mysql命令行用的,不影响服务端判定 - 保存后执行
sudo systemctl restart mysql(不是reload),否则零生效
HikariCP / Druid 的 maxLifetime 必须小于 wait_timeout
把 wait_timeout 设成 300 秒(5 分钟),但 HikariCP 的 maxLifetime 默认是 1800000 毫秒(30 分钟),连接池根本等不到 MySQL 断它,自己先销毁了;反过来,如果池子 idleTimeout 是 600000 毫秒(10 分钟),而 MySQL 设成 300 秒,那连接大概率在被 MySQL 杀之前就被池子回收了。
- HikariCP 推荐配法:
maxLifetime=270000(4.5 分钟)、idleTimeout=300000(5 分钟)、connection-test-query=SELECT 1、test-on-borrow=true(开发)或test-while-idle=true+validation-timeout=3(生产) - Druid 推荐配法:
testWhileIdle=true、timeBetweenEvictionRunsMillis=180000(3 分钟,≤wait_timeout的 1/2)、validationQuery=SELECT 1 - 别设
maxLifetime等于wait_timeout—— 必须留出缓冲时间,否则刚好卡在边界上容易触发验证失败
禁用 autoReconnect=true,用 validationQuery 替代
autoReconnect=true 在 MySQL 5.5+ 已失效,官方文档明确标注废弃。实测开启后仍抛 CommunicationsException: Communications link failure,更危险的是它可能掩盖事务一致性问题。
- 前一条语句已提交,重连后下一条执行在新会话里,造成逻辑断裂
- 原有连接上的事务会被回滚,会话变量、预编译 SQL、锁全部丢失
- 真正可靠的做法是启用
validationQuery=SELECT 1+test-on-borrow=true(开发)或test-while-idle=true(生产)
最容易被忽略的点是:即使参数全调对了,旧连接也不会立即断开 —— 它们会自然存活到空闲超时那一刻。所以改完配置后,要么等旧连接老化,要么主动重启应用连接池,否则看不到效果。











