Mysql
 sql >> Base de données >  >> RDS >> Mysql

Le minuteur d'annulation de l'instruction MySQL n'a pas réussi à s'arrêter

(ancienne question mais j'ai rencontré le même message d'erreur/avertissement) Utilisez-vous un pool jdbc avec QueryTimeoutInterceptor ou appelez statement.setQueryTimeout(320) une fonction. Il invoque un thread mysqljdbc.jar interne pour annuler les requêtes longues.

Le déploiement à chaud de Tomcat ne le reconnaît pas, de sorte que le thread reste en cours d'exécution et conserve un contexte d'application Web mort dans 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"
  />

Ce message d'avertissement The web application [TI] appears to have started a thread named [MySQL Statement Cancellation Timer] but has failed to stop it se produit même si cet écouteur est activé dans tomcat/conf/server.xml dossier. Je ne sais pas si l'application Web morte est publiée après un délai d'expiration de la requête. J'ai décidé de ne pas utiliser de délai d'attente de requête avec le pilote MySQL jdbc.

  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" 
        classesToInitialize="com.mysql.jdbc.NonRegisteringDriver" />