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
相关产品推荐
相关产品推荐

