i SqlConnectionオブジェクトを破棄しますが、もちろん実際には閉じていません。データベース オブジェクトのロックを保持しないようにするには、接続を閉じる必要があります。閉じた接続がロックを保持しないようにするにはどうすればよいですか?
知らない人のための上記の文の説明:
ADO または ADO.NET 接続を閉じても、実際には SQL Server への接続が切断されているわけではありません。ADO/ADO.NET インフラストラクチャは、再度使用したい場合に備えて接続を維持します。接続は、「接続プール」と呼ばれるものに残ります。
数分間使用されないと、接続は実際に閉じられます。しかし、そうではありません。TCP/IP には、TCP 接続をさらに数分間 (「CLOSE_WAIT」状態で) 開いたままにする独自の方法があります。これは、同じ IP:Port への TCP 接続を再度開くように要求した場合に行われます。その場合、すでに開いている TCP 接続を使用できます。
接続プールと SQL Server を使用すると、SQL Server への接続が確立されたままになります。各接続には、それが置かれているデータベース コンテキストがあります。接続がそのデータベースに置かれている限り、接続はそのデータベースの共有データベース (S-DB) ロックを保持します。
共有データベース ロックは、単に「私がいる間はこのデータベースを削除しないでください」という意味です。
接続プールの利点を維持しながら、データベースで共有ロックを保持しないようにするにはどうすればよいですか?
現在の私のアドホックな解決策は、開発者が Dispose を呼び出すたびに:
connection.Dispose()
これをグローバル ヘルパー関数の呼び出しに変更します。
Database.DisposeConnection(connection);
これにより、データベース コンテキストがmasterに変更されます。
public static void DisposeConnection(SqlConnection connection)
{
//Stop holding a database lock - in my database at least
ADOHelper.ExecuteNonQuery(connection, "USE master");
connection.Dispose();
}
それは私の差し迫った問題を解決します。閉じた接続がデータベースのロックを保持していません。
しかし今、私は接続プーリングが頭脳を混乱させるのではないかと心配しています.
誰かが知らなかった場合、または別の方法で考えた場合:
SDKから:
CloseとDisposeは機能的に同等です。