Oracle 11g TNSLSNR LAST_ACK连接泛滥

我们安装了带有Oracle 11.2.0.1.0数据库的Windows 2k3 EE SP2。 数据库被不同的应用程序(包括networking应用程序和服务)使用。 有时候,我们遇到了一些问题,导致Web应用程序出现意外的行为,例如缓慢或不完全加载页面,奇怪的redirect。 重新启动Tomcat和Oracle服务可以解决问题。

一旦问题再次出现,我看着tomcat日志,发现一个exception:

java.sql.SQLException: Io exception: The Network Adapter could not establish the connection 

我想到数据库服务器可能是繁忙的,过载的或者其他的东西,所以我检查了networking活动(使用CurrPorts)。 有几十个连接挂起了来自Oracle TNSLSNR.exe进程的“Last Ack”状态,请求本地端口1521(正如我们所知,它是进程本身 “侦听”的端口)。

当右击时,CurrPorts软件具有“closures选定的TCP连接”选项,所以我用它来处理所有这些死连接。 它立即解决了Web应用程序遇到的连接问题。 最糟糕的是,这种情况再次出现,每小时一次或两次出现一个新的连接在Last ack上。

所有这一切意味着每隔几天我就必须手动closures这些连接,因为我不知道为什么会发生这种情况,现在也不是解决办法。

所以,我想知道这是什么原因?

( 问题的图片 )

这里是TCP状态图的图片:

当系统收到一个FIN并成为“被动”接近的时候,系统会以LAST_ACK结束。

系统的IP栈然后用ACK来响应FIN ,并将相关的套接字设置为CLOSE_WAIT

然后应用程序需要实现套接字完成,在套接字上调用close() ,然后系统的IP堆栈发送FIN并将套接字设置为LAST_ACK

然后远程端需要用ACK来响应,并且套接字变为CLOSED 。 这是没有发生的一步。

我看到你使用本地系统的IP地址作为源和目的地。 对不起,我不了解Windows上的本地主机通信。 这可能是Windows问题或Oracle问题。 我希望至less能帮助你理解正在发生的事情,如果不是这样的话