私たちが作成したクライアント アプリケーションで、接続プールのパフォーマンスに興味深い動作が見られました。ユーザーがオブジェクトをクリックするたびに、より多くのオブジェクト固有のデータがデータベースからロードされます。これには、オブジェクトにもよりますが、クリックごとに 10 ~ 30 のクエリが必要です。
これは接続プールを使用して行われ、各クエリはプールからの新しい接続でディスパッチされ、クエリの実行後に接続が閉じられました。
パフォーマンスの最適化のためにプロファイラーでクエリを分析したところ、多くの監査ログイン/ログアウト エントリが存在することがわかりました。さらに、クエリ自体が正常に実行されていても、パフォーマンスは最適ではありませんでした (インデックスのシーク/スキャン演算子のみ)。
試してみるために、プーリングを無効にし、クライアント アプリケーションごとに 1 つの接続を保持して再利用するようにコードを変更しました。これにより、アプリケーション全体の応答性が大幅に向上し、すべての監査ログイン/ログアウト エントリがプロファイラーから消えました。
これはどのように可能ですか?接続を開いたままにしておくべきではありませんか、実際に開いたままにしておくと、少なくともこれほど遅くはないでしょうか? SqlConnection クラスを間違って使用していて、プールが無効になっている可能性はありますか?
プーリングに関する他の投稿を読みましたが、接続のプーリングと同じ接続の再利用との間の認識可能な速度の違いについては何も見つかりませんでした.
SqlConnection con = new SqlConnection(_connectionString);
接続は、トランザクション機能を提供するラッピング クラス Session に渡されます。
class Session{
Session(connection);
Abort();
Commit();
}
接続は Abort() と Commit() で閉じられます。これらのいずれかが常に呼び出されます。