连接超时参数是什么
MySQL 侧与连接生命周期相关的超时分成两类:空闲超时(wait_timeout、interactive_timeout)决定服务端多久回收没有活动的连接;读写超时(net_read_timeout、net_write_timeout)决定一次网络收发等待多久算失败。客户端报 Communications link failure、连接池偶发报错,多数要先在这几个参数和中间网络设备之间做取舍。
基本信息
| 空闲超时 | wait_timeout(默认 28800 秒)、interactive_timeout |
|---|---|
| 读写超时 | net_read_timeout(默认 30 秒)、net_write_timeout(默认 60 秒) |
| 连接超时 | connect_timeout,握手阶段等待时间 |
| 生效范围 | GLOBAL 影响新建连接;会话级直接改当前连接 |
| 排查入口 | SHOW VARIABLES LIKE '%timeout%'、SHOW PROCESSLIST |
典型使用场景
- 夜间无常访问的定时任务清晨首次执行报连接断开:空闲超时把连接回收了
- 应用与数据库之间隔着负载均衡或防火墙:设备空闲回收时间常短于 MySQL 默认值
- 报表类长查询被中断:net_read_timeout 太短或中间设备掐断长连接
- 连接池存活连接数虚高:闲置连接未及时释放,需要与超时参数对齐
- 安全合规要求收紧空闲连接:把 wait_timeout 调小,配合连接池校验
查看与调整
查看与调整
SHOW VARIABLES LIKE '%timeout%'; # 一次性看全部超时项
SHOW VARIABLES LIKE 'wait_timeout'; # 非交互连接空闲上限
SHOW VARIABLES LIKE 'interactive_timeout'; # 交互式客户端空闲上限
SET GLOBAL wait_timeout = 1800; # 只影响之后新建的连接
SET SESSION wait_timeout = 600; # 当前连接立即生效
SHOW PROCESSLIST; # 看连接时间与状态客户端侧保活与校验
客户端侧保活与校验
# JDBC 连接串:连接超时 5s、读超时 30s
jdbc:mysql://db:3306/app?connectTimeout=5000&socketTimeout=30000&useSSL=false
# HikariCP 常用校验配置
maximumPoolSize=20
idleTimeout=300000
dataSource.connectionTimeout=5000
# testWhileIdle + validationQuery=SELECT 1 可剔除已被服务端回收的连接参数选型对照
| 参数 | 控制什么 | 调小/调大的后果 |
|---|---|---|
| wait_timeout | 非交互连接空闲多久被关 | 调小连接池更易踩坑;调大则空闲连接长期占用内存 |
| interactive_timeout | 交互式客户端空闲多久被关 | mysql 命令行、GUI 工具走它,别只改错那个 |
| net_read_timeout | 等待客户端发来数据的时长 | 太小会误杀慢查询;太大则异常连接迟迟不释放 |
| connect_timeout | 握手阶段等待时长 | 网络抖动场景适当放大,避免误报连接失败 |
wait_timeout 与 interactive_timeout 在会话建立时会相互影响:客户端带 CLIENT_INTERACTIVE 标志时用 interactive_timeout,其余用 wait_timeout,因此只调 wait_timeout 对 GUI 工具往往无效。
盲目把超时调大只是把问题推后:空闲连接断开引发的报错应该用连接池校验与重试解决;如果中间设备(SLB、防火墙、NAT)有更短的回收时间,MySQL 端调到 24 小时也拦不住它掐连接。