我在 Tomcat 上托管并运行了我的应用程序 war 文件,几个月以来一直处于良好状态。最近没有对 Tomcat 配置或任何其他与环境相关的更改(如机器上的 Java 版本或 war 文件本身)进行更改。此外,服务器上的负载没有突然或快速增加,因为它是一个孤立的环境。
就在最近几天,客户端调用服务器挂掉了客户端,服务器上的trace显示,
java.net.SocketInputStream.socketRead0(Native Method)
java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
java.net.SocketInputStream.read(SocketInputStream.java:171)
java.net.SocketInputStream.read(SocketInputStream.java:141)
com.microsoft.sqlserver.jdbc.TDSChannel.read(IOBuffer.java:1525)
com.microsoft.sqlserver.jdbc.TDSReader.readPacket(IOBuffer.java:3274)
com.microsoft.sqlserver.jdbc.TDSCommand.startResponse(IOBuffer.java:4433)
com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:386)
是的,可以有一个Read Timeout的实现来防止导致Socket Timeout Exception的挂起并防止客户端挂起。但是问题来了,导致Socket Read无限期等待的所有可能原因是什么?
我尝试添加读取超时,这会导致客户端出现大量异常并导致失败。关于 Socket Read 不返回 并无限期等待的原因是什么的任何帮助?
但是问题来了,导致Socket Read无限期等待的所有可能原因有哪些?
套接字读取阻塞的唯一合理原因是:
远程服务器没有写入客户端正在尝试读取的数据。
阻止客户端/服务器通信的网络问题。
在这种情况下,最可能的解释是你的数据库服务器离线或卡住了。