でーたーべーす

とりあえず先週,いたれりつくせり?の出張でブツは収めてきたので,今はほんわかしてる .ま,残務はいろいろあるけど.
今日は次の開発へ向けての準備作業.VS.Netの開発環境インストールって時間かかるのね.
こっちは完全なる初心者なので周囲の先輩にいろいろ質問しまくり,もといお騒がせまくり(汗).

Javaな頭がまだ活性化しているうちにいくつか書き留めておこう.

Connection pool の exhaust

JDBCでDBに接続するプログラムを書いているとたまに

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

という例外にぶち当たる.

大抵はConnectionのclose()し忘れが原因らしい.
調べるには,
$TOMCAT_HOME/conf/server.xml
(JNDI設定をアプリケーション毎に規定している場合は,$TOMCAT_HOME/conf/Catalina/localhost/[アプリケーション名].xml
の ResourceParam で,
removeAbandoned, removeAbandonedTimeout, logAbandonedの設定を以下のように追加してあげる.


〜中略〜

removeAbandoned
true


removeAbandonedTimeout
300


logAbandoned
true


確立してから,Timeoutで指定した秒数(デフォルトは300秒)経過したConnectionが回収されるようになるみたい.
てなわけでclose()し忘れても上で回収してくれる.ちなみに,上記の例のようにlogAbandonedをtrueにしておくことで,これらの処理がログ($TOMCAT_HOME/logs/Catalina.out)に以下のような感じで吐き出されます.

DBCP object created 2006-02-08 10:52:30 by the following code was never closed:
java.lang.Exception
at org.apache.commons.dbcp.AbandonedTrace.setStackTrace(AbandonedTrace.java:157)
at org.apache.commons.dbcp.AbandonedObjectPool.borrowObject(AbandonedObjectPool.java:76)
at org.apache.commons.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:95)
at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:540)
    以下スタックトレース

スタックトレースを追えば,どこでclose()し忘れたが分かるので,とりあえず上記設定を施してアプリケーションを実行してしばらくしてからログを追えばOKという感じ.

当然ログに吐かれるのはTimeoutで指定した秒数経過後なので,
たとえばコマンドで

$ tail -f catalina.out

なんてやってても実際の操作とは連動して出てこないので注意.

参考URL:http://www.speculativeflow.net/java/commons-dbcp.html