java - java.net.SocketInputStream.socketRead0 的可能原因
问题描述
我在 Tomcat 上托管并运行了我的应用程序战争,它已经好几个月了。最近对 tomcat 配置或任何其他与环境相关的更改(例如机器上的 java 版本或战争本身)没有任何更改。此外,服务器上的负载不会突然或快速增加,因为它是一个孤立的环境。就在最近几天,从客户端到服务器的调用挂断了客户端,服务器上的跟踪显示,
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 不返回并无限期等待的原因有什么帮助?
解决方案
套接字读取阻塞的唯一合理原因是:
远程服务器尚未写入客户端试图读取的数据。
阻止客户端/服务器通信的网络问题。
推荐阅读
- google-apps-script - 为什么谷歌电子表格脚本无法排序?
- python-3.x - 如何将 IBM Cloudant 数据库连接到本地 python 代码?
- c# - excel互操作字符串数组到范围,不显示为公式
- r - 从与另一个数据帧匹配的非常大的数据帧中删除行的最快方法
- ruby-on-rails - (角度 8)在 $http Post 数据中发送文件数据会在 Rails API 日志中给出 {}
- java - Itext7定位异常
- c - 为什么 brk(void *end_data_segment) 的参数不向上舍入到下一页边界?
- jsf - 在 Java PrimeFaces Extension 中恢复动态表单数据
- laravel - Laravel RESTful 和多子域
- c++ - 在特定的 Unicode 路径中创建文件