(vecchia domanda ma ho riscontrato lo stesso messaggio di errore/avviso) Utilizzi un pool jdbc con QueryTimeoutInterceptor
oppure chiama statement.setQueryTimeout(320)
funzione. Invoca un thread mysqljdbc.jar interno per annullare le query di lunga durata.
Tomcat hotdeployment non lo riconosce, quindi il thread viene lasciato in esecuzione e mantiene un contesto webapp morto ancora nella 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"
/>
Questo messaggio di avviso The web application [TI] appears to have started a thread named [MySQL Statement Cancellation Timer] but has failed to stop it
accade anche se questo listener è attivato in tomcat/conf/server.xml
file. Non so se la webapp morta viene rilasciata dopo un timeout della query. Ho deciso di non utilizzare un timeout di query con il driver jdbc MySQL.
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener"
classesToInitialize="com.mysql.jdbc.NonRegisteringDriver" />