一个朋友让我帮忙解决他服务器上一个JAVA应用出现的问题,我利用业务时间赶赴现场两次,终于解决了这个疑难杂症,赶紧记录下来,不求能解救曾经和我一样困惑的劳苦大众,但愿自己别忘了。
一、问题的表现
首先说明一下环境,服务器是WINDOWS SERVER 2003,我对这个操作系统的特性不是很熟悉,只是当做普通的个人版操作系统来使用。我平时一般JAVA服务器都是安装LINUX。
数据库使用的SQL SERVER 2005,SP2。他的数据库本来是SQL SERVER 2000的,是我上周帮他做的迁移。
中间件使用RESIN 2.1.17,这是我非常喜欢和熟悉的SERVLET容器,加不加装APACHE都具有很好的WEB服务性能。
杀毒软件使用的瑞星,双网卡,硬件防火墙,什么牌子我没管。
那到底是什么问题?
这个!
com.microsoft.sqlserver.jdbc.SQLServerException: 到主机 的 TCP/IP 连接失败。 java.net.SocketException: No buffer space available (maximum connections reached?): JVM_Bind
RESIN启动后,在短时间内正常,但是在没有访问的情况下,会在几个小时后,自己死掉。静态页面没有问题,也就是基于HTTPWEB服务器没有死,涉及数据库连接的,都不行。
二、分析
我是第一次碰到这个错误,赶紧GOOGLE。
我首先自己排除了是程序的问题,网上有人说,是数据库连接没有关闭,这样的同志都是新手,而且我自己也可以肯定,程序是肯定没有问题的,这个错误,出现的位置绝对比数据库连接要底层的多。
网上的文章非常少,都看了一遍,总结一共有以下几个原因。
1. Windows服务器运行自动更新。具体为什么自动更新运行后,就会消耗系统这么多的SOCKET 连接,我还搞不清楚。但是有一点,自动更新肯定会占用网络带宽和CPU,在服务器上,我觉得应该是关闭自动更新的,采用人工更新的方法。
2.机器中了木马