ASP.NET と SQL Server 間の接続プールの問題を解決するにはどうすればよいですか? 質問する

ASP.NET と SQL Server 間の接続プールの問題を解決するにはどうすればよいですか? 質問する

ここ数日、当社の Web サイトで次のエラー メッセージが頻繁に表示されます。

「タイムアウトが経過しました。プールから接続を取得する前にタイムアウト期間が経過しました。プールされたすべての接続が使用中で、最大プール サイズに達したために発生した可能性があります。」

しばらくの間、コードに変更を加えていません。閉じられていない開いている接続をチェックするようにコードを修正しましたが、すべて問題ないことがわかりました。

  • これをどうすれば解決できますか?

  • このプールを編集する必要がありますか?

  • このプールの最大接続数を編集するにはどうすればいいですか?

  • トラフィックの多い Web サイトに推奨される値は何ですか?


アップデート:

IIS で何かを編集する必要がありますか?

アップデート:

アクティブな接続の数は 15 から 31 の間であることがわかりました。また、SQL サーバーで構成されている最大許容接続数は 3200 を超えていることがわかりました。31 は多すぎるのでしょうか、それとも ASP.NET 構成で何かを編集する必要がありますか?

ベストアンサー1

ほとんどの場合、接続プールの問題は接続リークFinalize()に関連しています。アプリケーションがデータベース接続を正しく一貫して閉じていない可能性があります。接続を開いたままにしておくと、.NET ガベージ コレクターがメソッドを呼び出して接続を閉じるまで、接続はブロックされたままになります。

本当に接続を閉じていることを確認する必要があります。たとえば、次のコードは、 と の間のコードが例外をスローすると.Open、接続リークを引き起こします。Close

var connection = new SqlConnection(connectionString);

connection.Open();
// some code
connection.Close();                

正しい方法は次のとおりです。

var connection = new SqlConnection(ConnectionString);

try
{
     connection.Open();
     someCall (connection);
}
finally
{
     connection.Close();                
}

または

using (SqlConnection connection = new SqlConnection(connectionString))
{
     connection.Open();
     someCall(connection);
}

関数がクラス メソッドから接続を返すときは、必ずそれをローカルにキャッシュし、そのCloseメソッドを呼び出してください。次のコードを使用すると、接続がリークされます。たとえば、次のようになります。

var command = new OleDbCommand(someUpdateQuery, getConnection());

result = command.ExecuteNonQuery();
connection().Close(); 

最初の呼び出しから返された接続はgetConnection()閉じられていません。この行は、接続を閉じる代わりに、新しい接続を作成して閉じようとします。

SqlDataReaderまたは を使用する場合はOleDbDataReader、それらを閉じます。接続自体を閉じることで問題が解決するように見えますが、データ リーダー オブジェクトを使用するときは、明示的に閉じるように余分な労力を費やしてください。


この記事 "接続プールがオーバーフローするのはなぜですか?MSDN/SQL Magazine の「」では、多くの詳細が説明されており、いくつかのデバッグ戦略が提案されています。

  • sp_whoまたはを実行しますsp_who2。これらのシステム ストアド プロシージャは、sysprocessesすべての作業プロセスの状態と情報を示すシステム テーブルからの情報を返します。通常、接続ごとに 1 つのサーバー プロセス ID (SPID) が表示されます。接続文字列でアプリケーション名引数を使用して接続に名前を付けると、作業中の接続を簡単に見つけることができます。
  • 開いている接続をトレースするには、 SQLProfilerTSQL_Replayテンプレートで SQL Server Profiler を使用します。Profiler に慣れている場合は、sp_who を使用してポーリングするよりもこの方法が簡単です。
  • パフォーマンス モニターを使用して、プールと接続を監視します。この方法については後ほど説明します。
  • コード内のパフォーマンス カウンターを監視します。カウンターを抽出するルーチンを使用するか、新しい .NET PerformanceCounter コントロールを使用することで、接続プールの状態と確立された接続の数を監視できます。

おすすめ記事