如果您打开一个记录集,然后在记录集仍然打开的情况下使用该连接进行其他操作,Web服务器将打开一个新端口与DB通信,然后立即将该端口置于TIME_WAIT状态。
我一直在浏览网站来解决这个问题(通过在连接重新使用之前关闭记录集 - 它可以工作)但是注意到了一些奇怪的事情。
当页面上有“Response.Flush”时,无论你做什么,它都会导致使用额外的端口,然后进入无用的TIME_WAIT状态。这可能导致严重的港口用尽情况。
示例代码:
<%@ Language=VBScript %>
<html>
<head>
</head>
<body>
<%
response.flush
set cnn = server.CreateObject("adodb.connection")
CNN.cursorlocation=3
cnn.open [YOUR CONNECTION STRING]
set rs=server.createobject("adodb.recordset")
set rs=cnn.execute("select top 1 * from [YOUR TABLE]")
cnn.close
set cnn=nothing
%>
</body>
</html>
要检查时间等待,您可以运行:
netstat -nao | find /i "[YOUR DB IP]" /c
通过Web服务器上的命令提示符。假设这是一个测试系统,您应该立即看到从Web服务器到数据库服务器的time_wait连接弹出窗口。删除同花顺,然后停止。
谷歌搜索没有帮助 - 对任何建议持开放态度。
环境: IIS 7.5,经典ASP,SQL Server 2008。
修改
我也根据评论尝试了这个:
Set cmd = Server.CreateObject("ADODB.Command")
With cmd
'No need to handle connection let ADODB.Command create and destory it.
.ActiveConnection = sqlcnnstr1
.CommandType = 1
.CommandText = "select top 1 * from [YOUR_TABLE]"
Set rs = .Execute()
If Not rs.EOF Then data = rs.GetRows()
Call rs.Close()
Set rs = Nothing
End with
Set cmd = Nothing
还是同样的问题。使用齐平,额外连接,没有相同的连接。
编辑2 原来它与数据库无关。如果你只有一个响应。刷,没有别的,已经导致一个额外的连接,从IIS到客户端,所以我一直在寻找错误的东西
现在问题变成你可以通过而不是得到响应。刷新从IIS产生一个额外的连接到客户端。
答案 0 :(得分:1)
结果显示TIME_WAIT连接零与数据库有关,只有一个响应.flush打开一个从Web服务器到客户端的新连接,那个导致TIME_WAIT连接的连接。我没有找到解决方法,因此只是限制了响应。特殊情况下的刷新,否则不会刷新。