SqlConnectionオブジェクトをインスタンス化すると、接続プールから接続を取得していることを理解しています。 Open()を呼び出すと、接続が開きます。そのSqlConnectionオブジェクトでClose()またはDispose()メソッドを呼び出すと、接続プールに返されます。
ただし、それが本当に閉じているかどうか、またはデータベースへのアクティブな接続がまだ残っているかどうかは、実際にはわかりません。
SqlConnectionをネットワークレベルで強制的に閉じる、または少なくともいつ閉じるかを通知するにはどうすればよいですか?
例:
using(SqlConnection conn = new SqlConnection(DBConnString)) {
conn.Open();
SqlCommand cmd = conn.CreateCommand();
...
cmd.ExecuteReader(CommandBehavior.CloseConnection);
...
}
接続が完全に閉じていた場合、2回目と3回目の実行も300ミリ秒になるはずです。しかし、これらの実行では接続が完全に閉じられていないことがわかっています(SQL Serverのアクティビティモニターを確認しました)。認証などを実行するのに余分な200msはかかりません。
接続を強制的に閉じるにはどうすればよいですか?
アイデア
参照
多分 - SqlConnection.ClearPool
?
Moe Siskoの回答(Call _SqlConnection.ClearPool
_)は正しいです。
プールに戻るのではなく、本当に閉じるために接続が必要な場合があります。例として、スクラッチデータベースを作成し、スキーマを構築し、いくつかのものをテストし、すべてのテストに合格するとスクラッチデータベースを削除する単体テストがあります。
接続プールがアクティブな場合、アクティブな接続がまだあるため、drop databaseコマンドは失敗します。プログラマーの観点から見ると、すべてのSQLConnectionは閉じられていますが、プールはまだ1つ開いたままなので、SQL Serverはドロップを許可しません。
接続プールの処理方法に関する最良のドキュメントは、MSDNの SQL Server接続プールのこのページ です。オープンとクローズを繰り返すことでパフォーマンスが向上するため、接続プーリングを完全にオフにしたくありませんが、データベースを解放するために、SQLConnectionで「強制クローズ」を呼び出す必要がある場合があります。
これはClearPoolで行われます。閉じる/破棄する前にSqlConnection.ClearPool(connection)
を呼び出した場合、閉じる/破棄を行うと、実際になくなります。
接続プールを使用しない場合は、SqlConnection.ConnectionString
プロパティで指定する必要があります。例えば
"Data Source=MSSQL1;Database=AdventureWorks;Integrated Security=true;Pooling=false;"
SqlConnection
オブジェクトを破棄または閉じると、接続が閉じられ、接続プールに返されます。
一般的には、接続プールにその仕事をさせたいと思います-接続を本当に閉じたくないです。
具体的には、接続がプールに戻らないようにしたいのはなぜですか?