SqlConnection オブジェクトをインスタンス化すると、実際には接続プールから接続を取得していることを理解しています。Open() を呼び出すと、接続が開かれます。その SqlConnection オブジェクトで Close() または Dispose() メソッドを呼び出すと、接続プールに返されます。
ただし、それが本当に閉じているかどうか、またはデータベースへのアクティブな接続がまだあるかどうかはわかりません。
SqlConnection をネットワーク レベルで強制的に閉じるにはどうすればよいですか、または少なくともいつ閉じるかを伝えるにはどうすればよいですか?
例:
using(SqlConnection conn = new SqlConnection(DBConnString)) {
conn.Open();
SqlCommand cmd = conn.CreateCommand();
...
cmd.ExecuteReader(CommandBehavior.CloseConnection);
...
}
- 最初の実行: 300 ミリ秒
- 2 回目の実行: 100 ミリ秒
- 3 回目の実行: 100 ミリ秒
- 長時間(30分)待った後:300ミリ秒
接続が本当に閉じていた場合、2 回目と 3 回目の実行も 300 ミリ秒になるはずです。しかし、これらの実行では接続が完全に閉じられていないことがわかっています (SQL Server のアクティビティ モニターを確認しました)。認証などを実行するのに余分な 200 ミリ秒はかかりません。
接続を強制的に閉じるにはどうすればよいですか?
アイデア
- CommandBehavior.CloseConnection は機能しますか? (どうやらそうではない?)
- 接続文字列で「最大プール サイズ = 0」を設定しても機能しますか? (これはピュロス溶液になります)
- Dispose() は機能しますか?
参考文献
- 接続プーリングに関する記事
- Close() が実際には接続を閉じないことを示す別の例を次に示します。
- 接続プーリングの長所と短所に関する記事