1

VB.NetおよびSQLServer2008 R2の使用:

最近、sp_who2を使用して接続を反映するデータベースがあります。.Netアプリケーションが閉じてすべての接続が破棄されても、「。NetSqlClientデータプロバイダー」は引き続きアクティブです。

コードは次のようになります。

System.Data.SqlClientをインポートします

Private Sub TestSQLConnection()

    Dim strConnection As String
    strConnection = "Server=MyServer;UID=User;PWD=Password;Database=MyDatabase"


    Dim conn As New SqlConnection(strConnection)
    conn.Open()

    conn.Close()
    conn.Dispose()

    GC.Collect()
    GC.WaitForPendingFinalizers()

End Sub

そして、アプリケーションの実行後にsp_who2を使用してSQL Serverを見ると(太字の.NetSQLClientDataProviderを見てください)

SPIDステータスログインHostNameBlkByDBNameコマンドCPUTimeDiskIOLastBatch ProgramName SPID REQUESTID

57あなたのPCで寝ています。master AWAITING COMMAND 0 0 07/19 12:38:48 * .NetSqlClientデータプロバイダー* 570

実際にアプリケーションを閉じた場合にのみ、.NetSQLClientデータ接続がビューから削除されます。私が懸念しているのは次のとおりです。1。リソースの観点から、これらのプロセスがデータベースに与える影響と、接続が反映されてスリープしている理由。2.データベースをデタッチしようとすると、1つの接続がアクティブになっていますが、コードが閉じられて破棄されています。

4

1 に答える 1

3

これは接続プーリングと呼ばれます。特定の接続を開いた場合は、すぐにその接続を再度使用する可能性が高いと予想されます (実際にアプリケーションを閉じない限り)。そのため、SqlConnectionオブジェクトを閉じたり破棄したりしても、 SQL Server への実際のネットワーク接続は、バックグラウンドで開いたままになっています。

接続プールを実行しないように接続プロバイダーに指示できますが、通常は有効にしておくことをお勧めします。無効にするには、接続文字列Pooling=falseにオプションとして追加します。

プール内の既存の接続を強制的に閉じることもできます。私の最初のリンクには、次の情報が含まれています。

ADO.NET 2.0 では、プールをクリアするためにClearAllPoolsClearPoolという 2 つの新しいメソッドが導入されました。ClearAllPools は特定のプロバイダの接続プールをクリアし、ClearPool は特定の接続に関連付けられている接続プールをクリアします。呼び出し時に使用されている接続がある場合、それらは適切にマークされます。それらが閉じられると、それらはプールに戻される代わりに破棄されます。

于 2011-07-19T11:55:15.810 に答える