在经典 ASP 中使用 Response.Flush 导致 TIME_WAIT 端口问题

4
我最近意识到这个问题: 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状态中。这可能导致严重的端口耗尽问题。
示例代码:
 <%@ 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到客户端产生一个额外的连接。


从未遇到过这个问题,但我猜当你不高效地使用数据库连接时会发生这种情况,没有正确关闭资源、保持打开连接或释放内存等。 - user692942
我不知道如何更有效地完成上述任务 - 欢迎任何建议。无论我尝试什么,似乎都无法解决端口问题,除非我删除response.flush。 - Shalom Slavin
一些例子 - http://stackoverflow.com/a/26278209/692942 / http://stackoverflow.com/a/35735315/692942 / http://stackoverflow.com/a/22305896/692942 - user692942
更重要的是,使用连接的“Recordset”对象已经足够沉重了,关闭它并使用“Array”会更加高效。您遇到的问题是在尝试在“Response.Flush”期间保持连接,而这种方法虽然没有解释原因,但会使其变得无关紧要。 - user692942
没有成功...不过我会更新问题,展示我尝试过的内容。 - Shalom Slavin
显示剩余8条评论
2个回答

1
原来 TIME_WAIT 连接与数据库无关,只是 response.flush 会从 Web 服务器到客户端打开一个新连接,这就是导致 TIME_WAIT 连接的连接。我没有找到解决方法,因此只在特殊情况下限制 response.flush,否则不进行刷新。

0
我有一个运行多年的Class ASP网站,一直运行良好。 最近出现了这个问题。在Chrome浏览器上,状态会显示加载大约8分钟。不确定服务器上发生了什么变化导致了这个问题,也不确定解决方案是什么。
这是一个示例代码。
<H1> Testing Response.flush</H1>
<%
Response.flush
%>
Done

唯一的解决方案似乎是禁用缓冲区。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接