MySQL语句取消计时器无法停止 [英] MySQL Statement Cancellation Timer failed to Stop

查看:1891
本文介绍了MySQL语句取消计时器无法停止的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

以下警告的原因是什么。

What is the reason of the following warning.

WARNING: The web application [TI] registered the JDBC driver [com.mysql.jdbc.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
Apr 28, 2016 11:03:25 AM org.apache.catalina.loader.WebappClassLoaderBase clearReferencesThreads
WARNING: The web application [TI] appears to have started a thread named [MySQL Statement Cancellation Timer] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
java.lang.Object.wait(Native Method)
java.lang.Object.wait(Object.java:503)
java.util.TimerThread.mainLoop(Timer.java:526)
java.util.TimerThread.run(Timer.java:505)

每当我在代码中进行更改并且 tomcat 重新启动时,就会发生这种情况。
我正在创建 mysql 连接,我想我正在关闭它。

这是我的代码。

It occurs whenever I made change in my code and tomcat restart itself. I am creating mysql connection and I think I am closing it properly.
Here is my code.

@RequestMapping(value = "/file/md5", method = RequestMethod.POST)
public ResponseEntity<?> md5Status(@RequestParam(required = true) String filename) {

    Connection con = SqlUtility.getMysqlConnection(host, port, database,username, password);
    SqlUtility.closeDbInstances(SqlUtility.mysqlConnection);
    SqlUtility.closeDbInstances(con);
    return new ResponseEntity<>(HttpStatus.CONFLICT);
}

这是实用程序代码。

public static Connection mysqlConnection = null;
private static PreparedStatement preparedStatement = null;
private static ResultSet resultSet = null;

public static Connection getMysqlConnection(String host, int port, String database, String username,
        String password) {
    MysqlDataSource mds = null;
    try {
        if (mysqlConnection == null || mysqlConnection.isClosed()) {
            if (database != null && host != null) {
                while (mds == null) {
                    System.out.println("In Loop");
                    mds = new MysqlDataSource();
                    mds.setServerName(host);
                    mds.setPortNumber(port);
                    mds.setDatabaseName(database);
                    mds.setUser(username);
                    mds.setPassword(password);
                    try {
                        mysqlConnection = mds.getConnection();
                    } catch (CommunicationsException e) {
                        System.out.format(
                                "Error occurred while trying to get connection with database [%s]. Are your database host [%s] and port [%s] correct? %n%s%n",
                                database, host, port, e);
                        mds = null;
                        // Had to handle for retrying again and again
                        // This is because your mysql is bind on localhost change it in my.cfg 
                    }
                }
            } else {
                System.out.format(
                        "Error occurred while trying to get connection with database [%s] with username [%s] and password [%s].\n [ATTN] Make sure your DB adapter properties file contains all required attributes. %n",
                        database, username, password);

            }

        }
    } catch (SQLException e) {
        System.out.format(
                "Error occurred while trying to get connection at host [%s] with database [%s] with username [%s] and password [%s] %n%s%n",
                host, database, username, password, e);
        // It might be because of the database privileges which must be grant to access 
    } catch (RuntimeException e) {
        System.out.format("Error occurred while trying to get [%s] Connection %n%s%n", database, e);
    }

    if (mysqlConnection != null)
        System.out.format("[%S] Connection Successfully Created%n", database);
    return mysqlConnection;

}

public static void closeDbInstances(Connection con) {
    System.out.println("Trying to close Database Connection...");
    if (con != null && preparedStatement != null && resultSet != null) {
        try {
            resultSet.close();
            preparedStatement.close();
            con.close();
            System.out.println("Database Connection Closed");
        } catch (SQLException e) {
            System.out.println("Error occurred while trying to close Database connection " + e);
        }
    }
}


推荐答案

(旧问题,但我遇到了相同的错误/警告消息)
您是否使用带有 QueryTimeoutInterceptor 的jdbc池或调用 statement.setQueryTimeout(320)函数。它调用一个内部的mysqljdbc.jar线程来取消长时间运行的查询。

(old question but I encountered the same error/warning message) Do you use a jdbc pool with QueryTimeoutInterceptor or call statement.setQueryTimeout(320) function. It invokes an internal mysqljdbc.jar thread to cancel long running queries.

Tomcat hotdeployment无法识别它,因此线程继续运行并将死webapp上下文保留在RAM中。

Tomcat hotdeployment does not recognize it so thread is left running behind and keeping a dead webapp context still in 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"
  />

此警告消息 Web应用程序[TI]似乎已启动一个主题如果在 tomcat / conf / server.xml 文件中激活了此侦听器,则命名为[MySQL语句取消计时器]但未能阻止它。我不知道在查询超时后是否释放了死webapp。我决定不使用MySQL jdbc驱动程序的查询超时。

This warning message The web application [TI] appears to have started a thread named [MySQL Statement Cancellation Timer] but has failed to stop it happens even if this listener is activated in tomcat/conf/server.xml file. I don't know if dead webapp is released after a query timeout. I have decided not to use a query timeout with MySQL jdbc driver.

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

这篇关于MySQL语句取消计时器无法停止的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆