(pregunta anterior, pero encontré el mismo mensaje de error/advertencia) ¿Utiliza un grupo jdbc con QueryTimeoutInterceptor
o llame a statement.setQueryTimeout(320)
función. Invoca un subproceso interno mysqljdbc.jar para cancelar consultas de ejecución prolongada.
Tomcat hotdeployment no lo reconoce, por lo que el subproceso se queda atrás y mantiene un contexto de aplicación web muerto aún en la 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"
/>
Este mensaje de advertencia The web application [TI] appears to have started a thread named [MySQL Statement Cancellation Timer] but has failed to stop it
sucede incluso si este oyente está activado en tomcat/conf/server.xml
expediente. No sé si la aplicación web muerta se libera después de un tiempo de espera de consulta. He decidido no utilizar un tiempo de espera de consulta con el controlador MySQL jdbc.
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener"
classesToInitialize="com.mysql.jdbc.NonRegisteringDriver" />