Spring Boot使用tomcat连接池时出现的:Connection reset by peer: socket write error
Spring Boot在1.x.x版本默认使用tomcat连接池,该连接池配置不当时,容易出现如下问题
Connection reset by peer: socket write error
或者
The last packet successfully received from the server was xxx milliseconds ago.
The last packet sent successfully to the server was xxxx milliseconds ago
自2.0.0版后Spring Boot默认连接池改为HikariCP
出现该异常原因:tomcat连接池testWhileIdle属性默认为false,连接闲置时,并未进行验证,当数据库连接不稳定(网络波动,短暂断网)或者长时间不用连接超时(mysql默认连接8小时未用则超时),池中保有的连接其实已经断开,但由于没有检查,连接池还是认为当前连接可用,当程序调用数据库时,就会抛出异常
解决方案:
解决方法的主题思路是:设置testOnBorrow=true,即当从连接池取连接时先检验连接是否有效
- 使用spring boot默认配置情况下,一般不会出现该问题(spring自动帮我们设置了tomcat连接池的相关属性),如需定制,使用
spring.datasource.tomcat.*=
tomcat后面配置tomcat连接池中的各种属性,如
spring.datasource.tomcat.testOnBorrow=true
spring.datasource.tomcat.validationQuery=SELECT 1