「タイムアウトに達しました。プールから接続を取得する前にタイムアウト期間が過ぎました。プールされた接続がすべて使用中で、プール サイズの制限値に達した可能性があります。」エラーの対処方法

佐藤 靖典
SQL Developer Support Engineer

こんにちは。

この記事では、お問い合わせの多い事象の要因と対処方法を紹介します。
同一エラーが発生した場合は、参考にしてみてください。

 

1. 事象

ADO.NET アプリケーションで次のエラーが発生する。

例外の種類: InvalidOperationException
例外メッセージ: タイムアウトに達しました。プールから接続を取得する前にタイムアウト期間が過ぎました。プールされた接続がすべて使用中で、プール サイズの制限値に達した可能性があります。

2. 要因

上記エラーが発生するほとんどの要因は、接続文字列キーワード Max Pool Size 値を超えた接続試行が行われた場合です。

Max Pool Size は、接続プール機能を有効にしている場合に接続プールで管理可能な接続数を示します。
Max Pool Size の既定値は 100 であり、この既定値の場合は 101 個目の接続をオープンしようとした場合に前述のエラーが発生します。

Max Pool Size を超える要因は次の 2 つに大別できます。

  a. アプリケーションで Max Pool Size 以上の接続が必要となることがある
  b. 接続のクローズ漏れがあり、Max Pool Size を超える状況が生じる

それぞれの詳細を以下で見ていきましょう。

a. アプリケーションで Max Pool Size 以上の接続が必要となることがある

ASP.NET Web アプリケーションのように、多くのクライアントからのリクエストを単一のアプリケーション ドメインで処理するアプリケーションの動作について考えてみます。

ASP.NET Web アプリケーションが最大で 5 つの接続を使用する実装である場合、20 人のユーザーが同時にアクセスすると最大で 100 個の接続が使用されることになります。
このケースでは、21 人目のユーザーが同時にアクセスするとエラーが発生する可能性があります。

b. 接続のクローズ漏れがあり、Max Pool Size を超える状況が生じる

プール済みの接続は、Close または Dispose メソッドを実行することで、明示的に再利用可能となります。
使用済みと考えている接続でもクローズ漏れの場合は再利用できず、接続のオープン要求時に意図せずに新規接続が生成されるような動作では、Max Pool Size を超えてしまう可能性があります。

 

3. 対処方法

Max Pool Size の設定値が適切でない場合は、増やしてください。
また、想定以上の接続数が使われている可能性がある場合は、クローズ漏れがないかを確認してみてください。

Max Pool Size の設定は、接続文字列キーワード Max Pool Size に利用可能な接続数を指定します。
次の例では 200 を指定しています。

例) Server=SQLServerName;Database=DBName;User ID=UserName;Password=Password;Max Pool Size=200;

Max Pool Size にどれくらいの値を設定してよいかわからない場合は、以下を参考にしてみてください。

Max Pool Size の適正値は次の乗算で求めます。

ASP.NET Web アプリケーションで使用する最大接続数 x クライアント数

例えば、ASP.NET Web アプリケーションで使用する最大接続数が 5 で、クライアント数 100 のシステムでは、最大 500 本の接 続が必要となりますため、Max Pool Size には 500 (またはそれ以上) に設定する必要があります。

また、アプリケーションで使用する最大接続数は次のように判別します。

// 次のコードでは、使用している接続数の最大値は 1 です。//

SqlConnection1.Open (接続数 = 1) SqlConnection1.Close (接続数 = 0) SqlConnection2.Open (接続数 = 1) SqlConnection2.Close (接続数 = 0)

// 次のコードでは、使用している接続数の最大値は 2 です。//

SqlConnection1.Open (接続数 = 1) SqlConnection2.Open (接続数 = 2) SqlConnection2.Close (接続数 = 1) SqlConnection1.Close (接続数 = 0)

 

4. 補足

接続数を監視するには?

次の資料のパフォーマンス カウンターを使用することで、接続数を監視することが可能です。

  パフォーマンス カウンター (ADO.NET)

基本的には次のカウンタを監視し使用中の接続数を確認することで、Max Pool Size に達しそうかのおおよその判別が可能です。

- NumberOfActiveConnections (再利用できないオープン中の接続。)
- NumberOfPooledConnections (接続プールが管理している接続数。再利用可能な接続も含まれる。)

※ 注意点

NumberOfActiveConnections の監視は、上記資料の「既定ではオフになっているカウンターのアクティブ化」項目の設定が必要です。

また、Max Pool Size を超える接続は生成されないため、NumberOfActiveConnections や NumberOfPooledConnections の値が Max Pool Size 値を超えることはありません。
これらの値が Max Pool Size 値に近い状況を確認したら、Max Pool Size 値を大きくするかの判別の情報として活用しましょう。

 

上記の対処後も同一エラーが発生する場合は?

同一のエラーは、アプリケーションの実行環境の負荷によっても発生しますので、上記の対処後も発生する場合は、接続タイムアウトを延ばす対処を検討しましょう。

接続タイムアウトの設定は、接続文字列キーワード Connection Timeout または Connect Timeout に秒数を指定します。
次の例では 120 秒を指定しています。

例) Server=SQLServerName;Database=DBName;User ID=UserName;Password=Password; Max Pool Size=200 ; Connection Timeout=120;