4

最近、この問題に気付きました: https://blogs.msdn.microsoft.com/spike/2008/09/17/nested-recordset-and-the-portsocket-in-time_wait-problem-by-example/

レコードセットを開き、レコードセットを開いたまま別の接続を使用すると、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 サーバーから DB サーバーへの 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

まだ同じ問題。フラッシュあり、余分な接続、なし、同じ接続。

EDIT 2 データベースとは何の関係もないことがわかりました。IIS からclientへの余分な接続を既に引き起こしている response.flush しかない場合、私は間違ったことを見てきました。

問題は、response.flush が IIS からクライアントへの余分な接続を生成しないようにできるかどうかということになります。

4

1 に答える 1

1

TIME_WAIT 接続はデータベースとはまったく関係がないことが判明しました。response.flush を持つだけで、Web サーバーからクライアントへの新しい接続が開かれ、その接続が TIME_WAIT 接続になります。私はそれを回避する方法を見つけていないため、特別な状況でのみ response.flush を制限しています。それ以外の場合はフラッシュしません。

于 2016-08-22T14:29:03.913 に答える