sql >> Base de Datos >  >> RDS >> Mysql

El temporizador de cancelación de declaración de MySQL no se detuvo

(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&amp;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" />