MySQL连接超时由服务端和客户端参数共同控制,需区分连接建立阶段与建立后空闲超时:服务端wait_timeout和interactive_timeout控制空闲超时,默认28800秒,需GLOBAL设置并写入my.cnf;客户端如JDBC需配置connectTimeout和socketTimeout;连接池须同步调整maxLifetime并启用有效性验证。

MySQL 连接超时主要由服务端和客户端两方面参数共同控制,单独改一边可能无效。关键是要区分“连接建立阶段超时”和“连接建立后空闲超时”,两者对应不同参数。
服务端:控制已建立连接的空闲等待时间
这是最常配置的超时项,指连接成功后,如果客户端长时间不发任何请求,MySQL 服务端主动断开该连接的时间。
- wait_timeout:影响非交互式连接(如应用连接池、脚本连接),单位秒,默认通常为 28800(8 小时)
- interactive_timeout:影响交互式连接(如 mysql 命令行客户端),单位秒,默认也常为 28800
修改方式(需有 SUPER 权限):
SET GLOBAL wait_timeout = 300; // 设为 5 分钟
SET GLOBAL interactive_timeout = 300;
⚠️ 注意:该设置仅对新建立的连接生效;已存在的连接仍按旧值计时。如需持久化,需写入 MySQL 配置文件 my.cnf 或 my.ini 的 [mysqld] 段:
[mysqld]
wait_timeout = 300
interactive_timeout = 300
客户端:控制连接建立过程的等待上限
这是连接刚发起时,客户端等待服务端响应的最大时间,超时则报 “Connection refused” 或 “Lost connection” 类错误。
- Java JDBC:在连接 URL 后加 ?connectTimeout=5000&socketTimeout=30000(单位毫秒)
connectTimeout 控制 TCP 握手+认证阶段;socketTimeout 控制单次 SQL 执行等待结果的超时(非连接空闲) - Python PyMySQL:构造连接时传参 connect_timeout=5, read_timeout=30
- PHP mysqli:调用 mysqli_options($conn, MYSQLI_OPT_CONNECT_TIMEOUT, 5)
连接池场景必须同步调整的参数
若使用 HikariCP、Druid、DBCP 等连接池,光改 MySQL 服务端 wait_timeout 不够——连接池可能持有已超时的连接,下次取出时直接报错。
- 将连接池的 maxLifetime 设为略小于 MySQL 的 wait_timeout(例如 MySQL 设 300 秒,连接池设 280 秒)
- 开启连接有效性验证,如 HikariCP 的 connection-test-query=SELECT 1 或 validation-timeout
- 启用 test-on-borrow(借出前检测)或更轻量的 test-while-idle(空闲时检测)
如何验证当前连接超时设置是否生效
登录 MySQL 后执行:
SHOW VARIABLES LIKE '%timeout%';
重点关注 wait_timeout、interactive_timeout、connect_timeout(后者是服务端接受连接握手的超时,一般无需改动)
查看当前活跃连接及其已空闲时间:
SELECT id, user, host, db, command, time, state FROM information_schema.processlist WHERE command != 'Sleep' OR time > 60;
其中 time 列即该连接空闲秒数,可用于判断是否接近超时阈值。










