如何设置MySQL连接超时自动断开,调整wait_timeout和interactive_timeout参数?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1028个文字,预计阅读时间需要5分钟。
这两个参数控制的分别是+MySQL服务端主动关闭空闲连接的时间,不是客户端连接失败的超时(例如connect_timeout),也不是查询执行超时(那是max_execution_time)。简单来说,连接建立好了、没在跑SQL、干等着——等太久就断开连接。
关键区别在于:wait_timeout 作用于非交互式连接(比如应用服务器用 JDBC/PHP PDO 建的连接),interactive_timeout 作用于交互式连接(比如你敲 mysql -u root -p 进去的命令行会话)。但注意:MySQL 5.7+ 默认把新连接都按非交互式处理,除非客户端显式声明 CLIENT_INTERACTIVE 标志——而绝大多数 ORM、连接池(如 HikariCP、Druid)都不设这个标志,所以实际生效的几乎总是 wait_timeout。
怎么查当前值?别只看 SHOW VARIABLES
SHOW VARIABLES LIKE '%timeout%' 看到的是全局默认值,但每个连接启动时会从全局复制一份作为自己的会话级超时。真正决定当前连接几秒后断开的,是会话变量:
SELECT @@wait_timeout, @@interactive_timeout;
如果你用连接池,建议在池配置里加一条初始化 SQL(如 connection-init-sql=SET SESSION wait_timeout = 600),比改全局更安全——避免影响 DBA 的运维连接或其它应用。
本文共计1028个文字,预计阅读时间需要5分钟。
这两个参数控制的分别是+MySQL服务端主动关闭空闲连接的时间,不是客户端连接失败的超时(例如connect_timeout),也不是查询执行超时(那是max_execution_time)。简单来说,连接建立好了、没在跑SQL、干等着——等太久就断开连接。
关键区别在于:wait_timeout 作用于非交互式连接(比如应用服务器用 JDBC/PHP PDO 建的连接),interactive_timeout 作用于交互式连接(比如你敲 mysql -u root -p 进去的命令行会话)。但注意:MySQL 5.7+ 默认把新连接都按非交互式处理,除非客户端显式声明 CLIENT_INTERACTIVE 标志——而绝大多数 ORM、连接池(如 HikariCP、Druid)都不设这个标志,所以实际生效的几乎总是 wait_timeout。
怎么查当前值?别只看 SHOW VARIABLES
SHOW VARIABLES LIKE '%timeout%' 看到的是全局默认值,但每个连接启动时会从全局复制一份作为自己的会话级超时。真正决定当前连接几秒后断开的,是会话变量:
SELECT @@wait_timeout, @@interactive_timeout;
如果你用连接池,建议在池配置里加一条初始化 SQL(如 connection-init-sql=SET SESSION wait_timeout = 600),比改全局更安全——避免影响 DBA 的运维连接或其它应用。

