MySQL连接半夜断开的本质是HikariCP的max-lifetime未严格小于MySQL的wait_timeout,导致连接被MySQL主动kill后池中仍视为有效;应设max-lifetime=wait_timeout−60000,并配置keepalive-time、minimum-idle等5项关键参数,同时确保JDBC URL时区、驱动类及SSL配置正确。

MySQL连接半夜断开,本质是wait_timeout和max-lifetime不匹配
Spring Boot默认用HikariCP,但它不会自动适配MySQL的wait_timeout。查一下你的MySQL:执行SHOW GLOBAL VARIABLES LIKE 'wait_timeout';,典型值是28800(8小时)。如果HikariCP的max-lifetime设成默认的30分钟(1800000ms)或更长但没对齐,连接在MySQL侧被kill后,HikariCP还当它是活的——下一次取用就报Communications link failure。
关键不是“加个validation-query”,而是让连接在MySQL主动断开前就优雅退役:
-
max-lifetime必须严格小于wait_timeout,建议设为wait_timeout - 60000(留1分钟缓冲) -
idle-timeout控制空闲连接存活时长,建议设为600000(10分钟),避免长期空闲连接卡在池里 - 不要设
validation-query: SELECT 1——HikariCP 5.x+已弃用该参数,改用connection-test-query也不推荐;应启用connection-init-sql或依赖keepalive-time
application.yml里这5个HikariCP参数不能少
光写url和username只是连得上,不是连得稳。生产环境必须显式配置以下参数,否则等于裸奔:
-
maximum-pool-size: 20—— 默认10太小,高并发下容易阻塞;按MySQLmax_connections的60%设较安全 -
minimum-idle: 5—— 保证低峰期也有可用连接,避免冷启动延迟 -
connection-timeout: 30000—— 超过30秒拿不到连接就报错,别让线程无限等 -
max-lifetime: 28000000—— 对应wait_timeout=28800,留足800秒余量 -
keepalive-time: 300000—— HikariCP 5.0+新增,每5分钟发一次TCP keepalive包,防中间网络设备断连
注意:keepalive-time只在HikariCP ≥5.0.0生效,Spring Boot 3.2+自带,若用Spring Boot 2.7.x需手动升级HikariCP版本。
安装、修复、更新或打包一个基于 Python 和 PyMySQL 实现的 Windows `mysql` 命令。适用于用户希望在 PowerShell/CMD 中输入 `mysql` 时重定向到 Python 实现、需要交互式输入 MySQL 连接信息、需要同步到当前用户本地 bin 目录,或需要将该能力封装成可公开复用的 Codex skill。
时区、SSL、驱动类这些基础项一错全崩
很多“连不上”根本不是连接池问题,而是JDBC URL或驱动配置翻车:
- JDBC URL必须带
serverTimezone=Asia/Shanghai,否则java.time.LocalDateTime写入会错位甚至报错 - 本地开发可加
useSSL=false,但生产环境RDS或自建MySQL启用了SSL时,必须配enabledTLSProtocols=TLSv1.2并信任CA证书 -
driver-class-name必须用com.mysql.cj.jdbc.Driver(MySQL 8+),旧版com.mysql.jdbc.Driver在Spring Boot 2.4+已失效 - MySQL 8.0+默认身份验证插件是
caching_sha2_password,若用户是用旧方式创建的,要显式加allowPublicKeyRetrieval=true&useSSL=false
HikariCP健康检测别靠validation-query硬扛
用connection-test-query: SELECT 1做连接校验,每次取连接都执行一次SQL,性能损耗明显,且无法覆盖网络闪断场景。
真正有效的做法是组合使用:
- 启用
isolate-internal-queries: true(默认false),防止健康检查干扰业务事务隔离级别 - 配合
leak-detection-threshold: 60000(单位毫秒),60秒内未归还连接即记日志,快速定位连接泄漏点 - 加Actuator端点:
management.endpoints.web.exposure.include=health,metrics,loggers,threaddump,hikaricp,访问/actuator/hikaricp实时看active、idle、threads-awol等指标
最易被忽略的是:HikariCP的max-lifetime和MySQL的wait_timeout必须人工对齐,没有自动协商机制——这个差值一旦超了,凌晨三点的报警你就躲不掉。

















