【问题标题】:Response.Flush in Classic ASP causing TIME_WAIT ports经典 ASP 中的 Response.Flush 导致 TIME_WAIT 端口
【发布时间】:2016-12-22 03:06:44
【问题描述】:

我最近意识到这个问题: 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 服务器到您的数据库服务器的 time_wait 连接弹出。删除冲洗,这将停止。

谷歌搜索没有帮助 - 接受任何建议。

环境: IIS 7.5、经典 ASP、SQL Server 2008。

编辑:

我也根据 cmets 试过这个:

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 到 client,所以我一直在寻找错误的东西.

现在的问题变成了让 response.flush 产生一个从 IIS 到客户端的额外连接,你能侥幸逃脱吗?

【问题讨论】:

  • 从来没有遇到过这种情况,但我想当你没有有效地使用你的数据库连接、正确关闭不保持打开连接的资源、释放内存等时会发生什么。
  • 我不知道如何更有效地完成上述工作 - 接受任何建议。无论我尝试什么似乎都无法缓解端口问题,除非我删除 response.flush
  • 这很简单,不要让ADODB.Connection打开页面的长度。一种常见的方法是在执行查询时使用ADODB.Command,它允许您指定在执行命令对象时创建连接对象并为您打开它的连接字符串。结合这一点,您可以使用ADODB.RecordsetGetRows() 将其转换为不需要与数据库建立开放连接的二维数组。
  • 其中一些看起来很有用,但我不知道它是否适用于这里。在此示例中,刷新似乎是 time_wait 端口的唯一贡献者。我可以从这些链接中尝试的唯一方法是破坏我刚刚尝试过的记录集 - 没有变化。数组的想法不适用,因为在我的示例中我什至没有触及记录集,所以添加数组实际上只会让这个更重。

标签: asp-classic flush connection time-wait


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-30
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 2011-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多