tomcat oracle connect関連 パラメータ設定
javaログ:
[2018/10/08 18:48:44 JST](Thread-66)(ERROR)(dao)java.sql.SQLException: Connection has already been closed.
tomcatログ:
警告 [Tomcat JDBC Pool Cleaner[1329552164:1539246653257]] org.apache.tomcat.jdbc.pool.ConnectionPool.abandon Connection has been abandoned PooledConnection
TomcatのremoveAbandonedTimeoutのデフォルト値=60秒
Connectionクローズ漏れがある場合、Connection使いきれを防ぐため、
強制的に60秒経ったら、Connectionを回収する。
クローズ漏れがなければ、3600秒でもいいですが、
漏れがある場合、この秒数は最適な数値を考慮しなければならない。
<Tomcatの調査>
Tomcat8.5及びTomcat8.0のソースを確認し、
プールされているコネクションのクローズがTimerTaskで一定時間毎に処理されていることを確認した。
・検証1(前回10/18と同じ)
removeAbandoned=”true”
removeAbandonedTimeout=”3″
logAbandoned=”true”
⇒5000件を一括登録。エラーなし。
・検証2
removeAbandoned=”true”
removeAbandonedTimeout=”3″
logAbandoned=”true”
factory=”org.apache.tomcat.jdbc.pool.DataSourceFactory”
⇒5000件の組織を一括登録。エラーあり。コネクションがすでにクローズしている。
catalina.outにもコネクションをクローズする旨のログが出力されていた。
<考察>
Tomcat8.0では特に指定の無い場合、コネクションの取り回しにDBCP2を使用する。
DBCP2では”removeAbandoned”は無効パラメータとなっているため、
検証1の状態ではコネクションの自動回収は機能せず、エラーが発生しなかった。
検証2では”factory”を指定して”removeAbandoned”の設定が有効となるようにしたため、
コネクションの自動回収が機能して、一括処理中のコネクションが自動クローズされた。