■ 概要
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 クライアント数」となる