【トラブル】【SQL Server】例外:InvalidOperationException 「タイムアウトに達しました。プールから接続を取得する前に タイムアウト期間が過ぎました。・・・」

■ 概要

DBにアクセスするシステム構築中に、以下の例外「例外およびそのメッセージ」が発生した。
以下に、とても詳しく書いてあるので、一読した方がいいが、このブログでは、その原因および対処法などを簡易的に記録しておく。
http://blogs.msdn.com/b/jpsql/archive/2012/06/21/10322154.aspx

■ 例外およびそのメッセージ

System.InvalidOperationException

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

■ 原因

Max Pool Size (最大接続数。詳細は下記「補足」参照のこと)を超えた接続が行われた場合、発生する。

補足:Max Pool Sizeについて

 * 接続数の数え方は、以下の例を参照のこと。
例:次のコードでは、使用している接続数の最大値は 2 である
~~~~
SqlConnection1.Open (接続数 = 1) 
SqlConnection1.Close (接続数 = 0) 

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

 * Max Pool Size のデフォルト値は 100 となっている。
 * Max Pool Sizeの詳細について、以下を参照のこと。
http://msdn.microsoft.com/ja-jp/library/system.data.sqlclient.sqlconnectionstringbuilder.maxpoolsize.aspx

■ 対処法

[1] DBから取得したデータを使い終わったら、Close or Disposeを行っておく
 ⇒ なお、どうしてもClose処理を行った後に、DBデータを使用したい場合は、テーブルの値をクラスなどに保持しておけばいい
 ⇒ 処理途中でreturn文などを入れた場合にも、Close処理を行うことを忘れずに!(try-finallyのfinally句などに入れとくなどの仕組み・工夫をした方がいいかも)
http://social.msdn.microsoft.com/Forums/ja/sharepointsetupja/thread/125d5fd1-e58c-47f2-b2a5-252c0156613d
http://atamoco.boy.jp/mssql/other/InvalidOperationException.php
[2] Max Pool Size の設定値を増やす
 ⇒ 増やす際の目安は、「最大接続数 x クライアント数」となる