代码访问 SQL Server数据库时的错误: 由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作

有一台服务器,运行sqlserver数据库,有两个网站模块的数据库在上面,负载压力不大,平时没出现过问题。后来另外一个L部门放了一个网站上去,数据库也在同一台机器上,突然有天L部门反应网站访问不了了,FTP也连不上了。但数据库能够远程连接上。

远程到服务器上,FTP服务重启,无效;网站重启,无效,查看系统日志,发现有如下错误:

xxx在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接。 (provider: TCP Provider, error: 0 – 由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作。)。

没碰到过这种情况,为了恢复服务,索性把服务器重启了,一切都好了。过了两天,又有这种情况出现。google一下,知道大概原因是端口用完了,猜测是不是L部门网站代码有问题,数据库连接泄露没关闭完?没有使用连接池?看了代码,都没问题。只好查看系统端口的使用情况:

1 命令行下输入 netstat -ano >>D://net.txt ,列出目前端口使用情况,如下大概有三千多条 ,注意红色端口的使用

TCP    222.122.222.222:2756    52.122.120.88:80       CLOSE_WAIT      2144
TCP    222.122.222.222:2766    52.122.120.88:80       CLOSE_WAIT      2144
TCP    222.122.222.222:2776    52.122.120.88:80       CLOSE_WAIT      2144
TCP    222.122.222.222:2786   52.122.120.88:80       CLOSE_WAIT      2144
TCP    222.122.222.222:2796    52.122.120.88:80       CLOSE_WAIT      2144
TCP    222.122.222.222:2806    52.122.120.88:80       CLOSE_WAIT      2144
TCP    222.122.222.222:2816    52.122.120.88:80       CLOSE_WAIT      2144
TCP    222.122.222.222:2828    52.122.120.88:80       CLOSE_WAIT      2144
TCP    222.122.222.222:2838    52.122.120.88:80       CLOSE_WAIT      2144
TCP    222.122.222.222:2851    52.122.120.88:80       CLOSE_WAIT      2144
TCP    222.122.222.222:2860    52.122.120.88:80       CLOSE_WAIT      2144
TCP    222.122.222.222:2870    52.122.120.88:80       CLOSE_WAIT      2144
…….

发现本地在访问一个外网地址的80端口,对应PID是2144

2.命令行下输入 tasklist|findstr “2144”  查看 PID对应的进程

w3wp.exe    2144  services

看起来是一个网站,这时突然想起来,不久前发布了一个webservice,主要功能是用httpwebrequest分析提取某个网站的部分内容,返回给调用方

3.命令行下输入 C:\Windows\System32\inetsrv>appcmd list wp

WP “5648” (applicationPool:testmozhou)
WP “5664” (applicationPool:tqh.xxx.cn)
WP “1544” (applicationPool:www.lxxxg.com)
WP “2144” (applicationPool:data.tt.com)

确认问题来源,webservice多线程下,每个httpwebrequest没有及时释放问题所致

参考文章:http://blog.zhaojie.me/2010/08/lack-of-dynamic-ports-when-frequently-open-and-close-socket.html