MySQL语句取消计时器无法停止

以下警告的原因是什么?

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连接,我想我正在关闭它。
这是我的代码。

 @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线程来取消长时间运行的查询。

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

   

此警告消息The web application [TI] appears to have started a thread named [MySQL Statement Cancellation Timer] but has failed to stop it即使在tomcat/conf/server.xml文件中激活此侦听器, The web application [TI] appears to have started a thread named [MySQL Statement Cancellation Timer] but has failed to stop it 。 我不知道在查询超时后是否释放了死webapp。 我决定不使用MySQL jdbc驱动程序的查询超时。