目录
1、问题
2、排查问题
3、原因
4、解决问题
1、问题
公司一个很老的servlet项目,突然出现问题504。报错org.apache.catalina.connector.ClientAbortException: java.net.SocketException: Connection reset。
2、排查问题
刚开始以为是网络问题或者接口性能问题。排查代码和日志发现一个现象,每次请求超时都是假死十五分钟,并且都是执行sql语句的时候。
查看代码发现只是简单地sql,并且数据库的慢查询日志没有慢查询。翻查日志上下文发现,并没有高并发访问。并在尝试压测此接口时,也远远达不到十五分钟。
网络上查找问题,发现了相关内容。
3、原因
我们的网络通信过程如下:
Java服务器 <-> 防火墙 <-> 数据库服务器
java服务器会建立连接池,经过防火墙和数据库进行三次握手,正常情况防火墙会转发请求。如果防火墙删除这连接,就不会发送ASK包。java服务器再次使用这个连接发送请求,防火墙发现连接失效,就会丢弃网络包。java服务器没收到SDK,就会重新发包,如此循环。时间随着重发次数增加。
linux默认是十五次。
和客户确认了防火墙策略,长链接限制三十分钟。
4、解决问题
可以通过修改重试次数来减少重试次数或者配置一个连接在池中最大生存的时间