MySQL连接超时是常见问题,尤其在高并发或网络不稳定的场景下。合理配置超时参数能有效避免资源浪费和连接堆积。核心参数包括
wait_timeout、
interactive_timeout、
connect_timeout和
net_read_timeout等,它们分别控制不同阶段的超时行为。
设置非交互与交互式连接的空闲超时
wait_timeout控制普通连接在无操作后的最大空闲时间,
interactive_timeout针对交互式客户端(如命令行)。两者默认值通常为28800秒(8小时),可根据实际需求调低。 建议: 生产环境可设为600~1800秒,防止长时间空闲连接占用资源 修改方法:
SET GLOBAL wait_timeout = 600;永久生效需写入配置文件 my.cnf 的 [mysqld] 段:
[mysqld] wait_timeout = 600 interactive_timeout = 600
调整连接建立与数据读取超时
connect_timeout决定MySQL服务器等待客户端握手完成的时间,
net_read_timeout控制服务器从客户端读取数据的超时。网络较差时适当增加可减少失败率。 若应用频繁出现“Lost connection during handshake”,可将 connect_timeout 从默认5秒提升至10~15秒 大查询或慢网络下,net_read_timeout 可设为60~300秒 配置示例:
SET GLOBAL connect_timeout = 10; SET GLOBAL net_read_timeout = 60;
同样,加入 my.cnf 以持久化设置。
优化应用端连接池与主动检测
仅调整数据库参数不够,应用层也需配合。使用连接池(如HikariCP、Druid)时,应设置合理的最大空闲时间和连接验证机制。
启用 testOnBorrow 或 testWhileIdle,确保获取的连接有效 设置 maxLifetime 略小于 wait_timeout,避免使用被服务端关闭的连接 例如:wait_timeout=600,则连接池 maxLifetime 建议设为540秒基本上就这些。关键不是参数多复杂,而是理解每个超时的触发场景,并结合应用特点做匹配。定期检查
SHOW PROCESSLIST;中的睡眠连接数,也能帮助判断配置是否合理。
