1

VB.Net Windows サービスでは、現在、次の作業単位をプールしています。

ThreadPool.QueueUserWorkItem(operation, nextQueueID)  

各作業単位 (または理解を容易にするために使用するスレッド) で、次のようないくつかの MSSQL 操作が行われます。

    Using sqlcmd As New SqlCommand("", New SqlConnection(ConnString))
        With sqlcmd
            .CommandType = CommandType.Text
            .CommandText = "UPDATE [some table]"

            .Parameters.Add("@ID", SqlDbType.Int).Value = msgID

            .Connection.Open()
            .ExecuteNonQuery()
            .Connection.Close()   'Found connections not closed quick enough'
        End With
    End Using

サーバー上でを実行すると、またはにあるnetstat -a -oSQL サーバーへの接続が約 50 見られます。これは、特に 5 ~ 10 の接続で済むはるかに大規模な Web アプリケーションがあるため、過剰に思えます。 IDLEESTABLISHED

接続文字列はアプリケーションに対してグローバルであり (変更されません)、Pooling=true同様に定義されています。

これらのスレッドのそれぞれに独自の.EXE プロセスConnectionPoolがありますか?ConnectionPool

4

4 に答える 4

4

MS ドキュメントから -

「接続は、プロセスごと、アプリケーション ドメインごと、接続文字列ごと、および統合セキュリティが使用されている場合は、Windows ID ごとにプールされます」

http://msdn.microsoft.com/en-us/library/8xx3tyca.aspx

次のようなエラーが発生していますか?

例外の詳細: System.InvalidOperationException: タイムアウトが発生しました。プールから接続を取得する前に、タイムアウト期間が経過しました。これは、プールされたすべての接続が使用中で、最大プール サイズに達したために発生した可能性があります。

また、サービスでキューに入れられている作業項目の数は?

于 2008-09-25T01:22:00.613 に答える
2

コードの大きな問題の1つは、ExecuteNonQueryが例外をスローした場合に接続を閉じないことです。SqlCommandを破棄するだけでは不十分です。例外がスローされたときに、次のようにSqlConnectionも破棄する必要があります。

Using SqlConnection connection = New SqlConnection(ConnString)
    Using sqlcmd As New SqlCommand("", connection)        
        With sqlcmd            
          ... etc
        End With    
    End Using
End Using
于 2008-09-25T06:55:23.260 に答える
1

私は一般的に using ステートメントが好きですが、.NET ライブラリでは、ハンドルの実際の CLOSE がガベージ コレクションまで行われないことがあります。古い学校であり、そのようなことについて宗教的であるため、using ステートメントの最後に明示的な終了を追加します。私は一般的に VB.NET ではなく C# でコーディングしているため、これは疑似コードですが、アイデアが得られるはずです。

Using SqlConnection connection = New SqlConnection(ConnString)

   TRY
      Using sqlcmd As New SqlCommand("", connection)
                  With sqlcmd
                        ... etc
          End With
      End Using
   FINALLY
      connection.Close()

End Using
于 2009-01-09T21:43:39.940 に答える
0

開いている接続の数が気になる場合は、接続文字列を制御してください

注意: MinPoolSize と MaxPoolSize。

于 2008-09-25T02:43:36.360 に答える