You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot应用闲置12小时后触发MySQL连接超时500错误求助

解决方案

问题本质

你碰到的是数据库连接池失效连接未被及时清理的问题:MySQL会主动断开超过wait_timeout时长的空闲连接,但你的连接池没检测到这些连接已经失效,当服务器闲置12小时后,第一次请求复用了失效连接,就抛出了通信异常。刷新后连接池重新创建有效连接,所以临时恢复。你设置的server.tomcat.keep-alive-timeout是控制Tomcat的HTTP长连接,和数据库连接池完全无关,因此无效。

具体修复步骤

1. 给连接池配置连接有效性检测

Spring Boot默认用HikariCP连接池,在application.properties里加以下配置,让连接池在获取连接前先验证有效性:

# 检测连接是否可用的SQL语句
spring.datasource.hikari.connection-test-query=SELECT 1
# 连接空闲多久后被检测(必须小于MySQL的wait_timeout)
spring.datasource.hikari.idle-timeout=300000
# 连接最大存活时间(要比MySQL的wait_timeout短至少300秒)
spring.datasource.hikari.max-lifetime=7140000

如果用的是Tomcat JDBC连接池,对应配置改成:

spring.datasource.tomcat.test-on-borrow=true
spring.datasource.tomcat.validation-query=SELECT 1
spring.datasource.tomcat.time-between-eviction-runs-millis=300000
spring.datasource.tomcat.min-evictable-idle-time-millis=1800000

2. 调整MySQL的wait_timeout(可选)

如果服务器资源允许,可以修改MySQL的配置文件(my.cnf/my.ini),延长空闲连接超时时间,但不建议设得过长(会占用额外数据库资源):

wait_timeout=28800  # 8小时,可根据实际需求调整
interactive_timeout=28800

修改后重启MySQL服务生效。

3. 让连接池自动回收失效连接

确保连接池定期清理空闲失效连接:比如HikariCP的idle-timeout和max-lifetime,Tomcat JDBC的time-between-eviction-runs-millis和min-evictable-idle-time-millis,这些参数的值必须小于MySQL的wait_timeout,避免连接被MySQL断开后还留在连接池中。

验证方式

配置完成后,让服务器闲置超过12小时,再发起请求,如果不再出现500错误,说明配置生效。

内容的提问来源于stack exchange,提问作者user22541717

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 08:01:24