我最近意识到这个问题:
https://blogs.msdn.microsoft.com/spike/2008/09/17/nested-recordset-and-the-portsocket-in-time_wait-problem-by-example/
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服务器到数据库服务器的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到客户端的额外连接,所以我一直在寻找错误的东西.
现在问题变成了你可以逃脱没有response.flush产生从IIS到客户端的额外连接.
解决方法
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。