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”の設定が有効となるようにしたため、
コネクションの自動回収が機能して、一括処理中のコネクションが自動クローズされた。

 

 

Add a Comment

您的电子邮箱地址不会被公开。 必填项已用*标注