(古い質問ですが、同じエラー/警告メッセージが表示されました)QueryTimeoutInterceptor
でjdbcプールを使用していますか または、statement.setQueryTimeout(320)
を呼び出します 働き。内部のmysqljdbc.jarスレッドを呼び出して、長時間実行されるクエリをキャンセルします。
Tomcat hotdeploymentはそれを認識しないため、スレッドは実行されたままになり、死んだWebアプリケーションコンテキストをRAMに保持します。
<Resource name="jdbc/BSManager" auth="Container"
type="javax.sql.DataSource" factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
initialSize="2" maxActive="100" maxIdle="10" maxWait="30000"
username="myuser" password="mypwd"
driverClassName="com.mysql.jdbc.Driver"
jdbcInterceptors="org.apache.tomcat.jdbc.pool.interceptor.QueryTimeoutInterceptor(queryTimeout=320)"
url="jdbc:mysql://127.0.0.1:3306/mydb?useUnicode=true&characterEncoding=utf8"
validationQuery="SELECT 1" removeAbandoned="true" removeAbandonedTimeout="7200"
testOnBorrow="true" maxAge="1800000"
/>
この警告メッセージThe web application [TI] appears to have started a thread named [MySQL Statement Cancellation Timer] but has failed to stop it
このリスナーがtomcat/conf/server.xml
でアクティブ化されている場合でも発生します ファイル。クエリのタイムアウト後にデッドWebアプリケーションがリリースされるかどうかはわかりません。 MySQLjdbcドライバーでクエリタイムアウトを使用しないことにしました。
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener"
classesToInitialize="com.mysql.jdbc.NonRegisteringDriver" />