プロが教える店舗&オフィスのセキュリティ対策術

PostgreSQLを利用したJavaのシステムで、DB更新中に、エラーが発生することがあります。
その後、再処理を行うと、次のメッセージが出ます。

org.apache.commons.dbcp.SQLNestedException: Cannot get a connection, pool exhausted

Tomcatを再起動すると、正常にDB更新が出来るようになります。

ほぼ毎日使っているシステムですが、1月18日と、4月26日の2回発生しています。
どのようなところを調査すればよいか、教えてください。
よろしくお願いします。

A 回答 (2件)

こんにちは。



そのままエラーメッセージを検索エンジンにひっかけるといろいろな情報が出てきますよ。

例えば
http://d.hatena.ne.jp/kawam/20060208

エラーメッセージの意味もそのままで、プールを使い果たしてコネクションが取得できないという意味です。

取得したコネクションのclose漏れが原因だと思います。

Connection conn = null;
try {
conn = コネクション取得
// なんかいろいろ処理
conn.close();
} catch ( Exception e ) {
// エラーが起きたとき
}

この場合、なんかいろいろな処理で例外が発生した場合はコネクションが閉じられない状態になります。

Connection conn = null;
try {
conn = コネクション取得
// なんかいろいろな処理
} catch ( Exception e ) {
} finally {
if ( conn != null )
conn.close();
}

こうすると例外が発生しても必ずfinallyを通りますのでコネクションがクローズされます。

コネクション周りを見直してみてください。
    • good
    • 0
この回答へのお礼

早速のご回答ありがとうございます。

プログラムを調べて見ましたところ、
finallyには、コネクションのcloseをする文がありませんでした。

if ( conn != null )
conn.close();
を追加してみます。

お礼日時:2013/04/30 15:24

エラーメッセージの指摘に従って調査すればよいのではないでしょうか?


コネクションプールが空になったのなら、DBコネクションのクローズ抜けの
調査をすべきでしょう。単純な話です。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

Connectionのクローズ漏れの調査をします。

お礼日時:2013/05/02 18:53

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!