我最近意识到这个问题: https://blogs.msdn.microsoft.com/spike/2008/09/17/nested-recordset-and-the-portsocket-in-time_wait-problem-by-example/。在此问题中,如果您打开一个记录集,然后在记录集仍然打开时使用连接进行其他操作,Web服务器将打开一个新端口与数据库通信,然后立即将该端口放入TIME_WAIT状态。
我一直在修改网站以解决此问题(通过在重用连接之前关闭记录集 - 它可以正常工作),但注意到了一些奇怪的东西。
当页面上有“Response.Flush”时,无论您做什么,它都会导致使用额外的端口,然后被放入无用的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服务器到DB服务器的time_wait连接弹出。移除刷新,这将停止。
谷歌搜索没有帮助 - 欢迎任何建议。
环境: IIS 7.5,Classic 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 事实证明这与数据库无关。如果你只有response.flush,没有其他内容,那么就会从IIS到客户端产生一个额外的连接,所以我一直在看错了东西。
现在的问题是你能否避免response.flush从IIS到客户端产生一个额外的连接。