Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

O temporizador de cancelamento de instrução MySQL falhou ao parar


(pergunta antiga, mas encontrei a mesma mensagem de erro/aviso) Você usa um pool jdbc com QueryTimeoutInterceptor ou chame statement.setQueryTimeout(320) função. Ele invoca um thread interno mysqljdbc.jar para cancelar consultas de longa duração.

O hotdeployment do Tomcat não o reconhece, então o thread é deixado em execução e mantendo um contexto de webapp morto ainda na 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"
  />

Esta mensagem de aviso The web application [TI] appears to have started a thread named [MySQL Statement Cancellation Timer] but has failed to stop it acontece mesmo se este listener estiver ativado em tomcat/conf/server.xml Arquivo. Não sei se o webapp morto é lançado após um tempo limite de consulta. Decidi não usar um tempo limite de consulta com o driver jdbc do MySQL.
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" 
        classesToInitialize="com.mysql.jdbc.NonRegisteringDriver" />