在大批量短时间访问数据库的时候可能会造成这个问题,至少我就是因为这个情况才查找这个问题的,另外也会出现数据库连接失败的情况见:Communications link failure的解决办法数据库连接失败对数据进行一些配置就可以解决了,但是本章节的问题确实操作系统资源消耗殆尽造成的。
问题出现的原因:有不当程序创建了大量的短连接,由于程序的不健壮,导致SOCKET处于忙碌或者TIME_WAIT状态,或者服务器和客户端有一方出现异常,而另一方没有得到通知,还在连接,持续不断的做写操作。另一个方面还有可能是,windows系统在更新或者修补漏铜也会消耗大量的socket的。
解决方法:程序通过http请求数据就会占用socket,而使用完成后SOCKET.close()是不马上释放连接的,而是设置为TIME_WAIT状态,这个时间默认是240S,也就是4分钟。这太长了,有30秒(最小值)就可以了。在修改这个默认值的时候,还发现这台机器并没有开启大端口服务,也就是高于5000的端口。这也是会出现“系统缺乏足够缓冲区空间或者因为队列已满无法执行套接字上操作”错误的!而那WEB服务就是配置到1万以上端口的!赶紧,操作方法如下:
1. 启动注册表编辑器。 HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Tcpip/Parameters
2. 新建
值名称:MaxUserPort
值类型: DWORD
值数据: 65534(用十进制的方法写进去就可以,如果是十六进制,是FFFE,因为4个F是65535嘛)
有效范围: 5000 - 65534 (十进制)
默认: 0x1388 5000 (十进制)
新建
值名称:TCPTimedWaitDelay
值类型: DWORD
值数据: 0000001e(也就是30,不行可以用WINDOWS计算器,很方便,这个表示TIME_WAIT的秒数)
引用来自:http://blog.csdn.net/jinwanmeng/article/details/8809935