Mysql
 sql >> Database >  >> RDS >> Mysql

Il timer di cancellazione dell'istruzione MySQL non è riuscito a fermarsi

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