应修改XAMPP的my.ini文件中[mysqld]段的wait_timeout和interactive_timeout值(建议设为相同,如28800),并重启MySQL服务;同时需同步配置应用层连接池的maxLifetime等参数,否则仅调数据库端无效。

直接改 my.ini 里的 wait_timeout 和 interactive_timeout
XAMPP 的 MySQL 配置文件是 my.ini,不是 my.cnf,路径通常为 C:\xampp\mysql\bin\my.ini(Windows)或 /Applications/XAMPP/xamppfiles/etc/my.cnf(macOS)。打开后找到 [mysqld] 段,在下面添加两行:
wait_timeout = 28800 interactive_timeout = 28800
单位是秒,28800 表示 8 小时;若想设为 24 小时,填 86400 即可。注意:这两个值建议设成一样,否则应用里部分连接可能走 wait_timeout、部分走 interactive_timeout,行为不一致。
改完必须重启 MySQL 服务(通过 XAMPP Control Panel 点击 Stop 再 Start),否则不生效。动态执行 SET GLOBAL wait_timeout = 28800 临时有效,但重启后丢失,且需要管理员权限,不如直接改配置文件稳妥。
验证是否生效:用 SHOW VARIABLES 查当前值
改完重启后,进 MySQL 命令行(mysql -u root -p),运行:
SHOW VARIABLES LIKE 'wait_timeout'; SHOW VARIABLES LIKE 'interactive_timeout';
输出的 Value 字段应与你写入 my.ini 的值一致。如果还是 28800(即默认 8 小时)或别的旧值,说明:
-
my.ini没有被 MySQL 实际加载(检查是否改错文件,或确认[mysqld]段落位置正确) - 改完没重启服务
- 有多个配置文件被读取,后加载的覆盖了你的设置(可用
mysqld --verbose --help | findstr "Default options"在 Windows 查找实际加载路径)
别漏掉应用层的连接池超时设置
只调数据库端的 wait_timeout 不够——它只管“空闲断连”,不管连接池复用失效连接的问题。比如 PHP 用 PDO + 连接池(如 Laravel 的 DB),或 Java 用 HikariCP,都必须同步配好连接生命周期:
- PDO 场景下,每次查询前加
$pdo->ping()检测连接有效性,失效则重连 - HikariCP 要设
maxLifetime小于wait_timeout(例如数据库设28800,连接池设25200),避免连接在服务端被 kill 后还被取出使用 - Spring Boot 中还需检查
spring.datasource.hikari.connection-timeout(建立连接超时)和socketTimeout(JDBC 查询超时),它们和wait_timeout是不同维度的参数
否则即使数据库设成 7 天,应用仍会在第一次请求时报 MySQL server has gone away。
常见误操作:把 connect_timeout 当成连接空闲超时
connect_timeout 控制的是“客户端发起 TCP 连接请求后,等待服务器响应 SYN-ACK 的最大时间”,默认 10 秒,跟连接建好后的空闲超时完全无关。它只影响连接建立失败场景,比如网络不通、MySQL 进程挂了、防火墙拦截等。
如果你遇到的是页面刷新一次就恢复、隔几小时又报错,那基本可以排除 connect_timeout,真正该调的是 wait_timeout。顺带一提:net_read_timeout 和 net_write_timeout 影响的是大查询传输过程中的中断判断,一般不用动,除非你明确在跑超长导出或 BLOB 写入。
最易被忽略的一点:XAMPP 默认启用 skip-name-resolve(在 my.ini 的 [mysqld] 下),这能加速远程连接解析,但如果本地开发时用 localhost 连接,反而可能因 DNS 回环导致轻微延迟——不过它和超时无直接关系,只是常被一起修改,需留意副作用。


















