我们安装了 Windows 2k3 EE SP2,其中安装了 Oracle 11.2.0.1.0 DB。该 DB 由不同的应用程序(包括 Web 应用程序和服务)使用。有时,我们的 Web 应用程序会遇到一些问题,导致其中出现意外行为,例如页面加载缓慢或未完全加载、奇怪的重定向。重新启动 Tomcat 和 Oracle 服务可修复此问题。
有一次问题再次出现,我查看了 tomcat 日志并发现一个异常:
java.sql.SQLException: Io exception: The Network Adapter could not establish the connection
我突然想到数据库服务器可能很忙、超载或类似情况,所以我检查了网络活动(使用 CurrPorts)。有数十个连接挂起,状态为“Last Ack”,这些连接源自 Oracle TNSLSNR.exe 进程,请求本地端口 1521(我们知道,这是进程的端口本身“听”)。
CurrPorts 软件在右键单击时有“关闭选定的 TCP 连接”选项,因此我将其用于所有这些死连接。它立即修复了 Web 应用程序遇到的连接问题。最糟糕的是,这种情况会反复出现,因为每小时会出现一两次新的连接卡在 Last ack 上。
这一切意味着每隔几天,我必须手动关闭这些连接,因为我不知道它们为什么会发生,也不知道目前的解决方案。
因此,我想知道造成这种情况的原因是什么?
(问题形象)
答案1
下面是 TCP 状态图:
LAST_ACK
当系统接收到FIN
并成为“被动”终结者时,它就会结束。
然后,系统的 IP 堆栈将用 来响应该请求,FIN
并将ACK
相关套接字设置为CLOSE_WAIT
。
然后应用程序需要意识到套接字已完成,调用close()
套接字,然后系统的 IP 堆栈发送FIN
并将套接字设置为LAST_ACK
。
然后,远端需要用 进行响应ACK
,套接字将变为CLOSED
。这是没有发生的步骤。
我看到您使用本地系统的 IP 地址作为源和目标。抱歉,我对 Windows 上的本地主机通信不太了解。这可能是 Windows 问题或 Oracle 问题。我希望这至少能帮助您理解什么正在发生,如果没有为什么。