武石はじめにコネクションプールを使用した環境において実際に発生した落とし穴です。SP3)は別マシン環境にありAPサーバ(Resin)のコネクションプールを利用してアプリケーションからJDBCで接続している。問題点の解説コネクションプールが一杯になりデータベース接続が遅延・滞留してしまう原因の1つとして以下のコネクションの存在が判明。今回コネクションの障害は同一のオブジェクト(Connection)に対して2回データベース接続を行ったことが原因であるが、このパターンの問題は通常あまり見られずまた見落としがちである。データベース接続に対する開放(close)は多少の経験があれば必ず行う必要のある処理であることは理解できまた正しく確実に開放(close)されているか確認することであろう。今回の問題はデータベース接続を開放(close)する通常フォーカスしているのとはまったく違う意味で実装(不具合の実装)が可能でなおかつ見つけにくい問題であったが、ソース解析によってこの問題点にフォーカスできさらにこの問題を障害として再現可能であったため取り除くことが可能であった。大げさだと思われるかもしれないがプログラマーのスキル(知識や経験)、そしてちょっとした処理フローの見落としで難なく発生することが可能になる。特定が難しい場合も多くある。オブジェクト(Connection)を広範囲のスコープで利用可能にしている場合は注意が必要であるしこういったオブジェクトは限られたスコープで用いるべきであろう。発生するのは当たり前だと思っている貴方も今までのプログラムを注意深く観察してみては如何であろう。先ほど「問題の障害を再現可能であったため」と言ったがコネクションプールを利用していたのが障害発生の諸原因であり逆にコネクションプールを利用することで障害の確認が容易に可能であった。コネクションプールを使用していなかったら障害が発生していなかったかもしれない、あるいは違った形の障害となっていた可能性もある。その場合その障害を確認するのは困難を極めたであろう。コネクションプールを利用すべきであると説いているわけではないので誤解しないように。問題点の確認もしこの問題を実際に試してみたければ以下の内容を参考にAPサーバでご確認いただきたい。想定しているのでご了承願いたい。確認は出来ると思うので試してみても良いでしょう。この動作確認における責任は各自で負う事。1.Resinのコンフィグレーションファイルresin.conf(%RESIN_HOME%/conf/resin.conf)をテキストエディターで開くと40行目あたりに以下の記述が見つかる。以下の様にリソース定義を追加する。追加する内容は動作可能な環境に合わせて記述願う。リソース名(プーリングのデータソース名)を定義する。リソース(データソース)のタイプを設定。JDBCドライバを使用する場合。他のデータベース及びJDBCドライバを使用する場合は合わせてください。接続先のデータベースサーバ名またはIPアドレスを指定。データベースアカウントの既定のデータベース以外に接続する場合や明示的に指定する場合、データベース名を指定。部分は省略可能である。コネクションプールの最大プール数を指定。確認テストであれば多くは要らない。コネクションプールからプールを取得する最大待ち時間と思われる(単位は分)しかし1分に設定しても1分で帰ってこないので違うかも知れない。知っている人は情報ください。データベースに接続した後、テーブルなどのオブジェクトに対して操作はしないのでバックアップなどは不要である。次ページから確認用プログラム(JSP)が3本出てくるが、その3本のプログラムの配置場所はサーブレットコンテナ上で実行するのに有効な場所であればどこに配置しても問題は無い。2.コネクションのプログラムで確認コネクションプールを消費させるコネクションのサンプルソースを以下に載せる。resin.confのリソース(データソース)定義に合わせればこのまま動くはずである。size="5">接続ボタンを押してください。<br>押す度にコネクションが1つずつ消費されていきます。%><hr></center></form></body></html>3.コネクション未開放のプログラムで確認コネクションを1回だけ行い開放(クローズ)しない場合でも確認してしてはどうなるであろう。聞くまでも無いだろう。size="5">接続ボタンを押してください。<br>押す度にコネクションが1つずつ消費されていきます。%><hr></center></form></body></html>4.コネクションプールのリソース確認プログラムコネクションプールの各情報とresinが使用するJVMヒープメモリなど情報を表示するツールを以下に載せる。Resinにはコネクションプールを利用するためのライブラリ(com.caucho.sql.DBPool)が標準で付いているためコネクションプールを利用するのがとても楽である。環境に合わせて本ソースを修正する場合は5行目〜16行目のみの修正でよいはずである。設定に併せて以下を変更してください。%>秒おきにリロードします。%></td><%}%></tr></table></td><%}%></tr><tr><td></td></tr><%}%></table></td></tr><tr><td>・pool数の背景が黄色、または赤色になりましたらシステム管理者に連絡して下さい。</td></tr><tr><td>&nbsp;(黄色:40-70%使用中、赤色:70-100%使用中)</td></tr><tr><td>・情報取得に失敗した場合は、-1が表示されます。%></center></body></html>。