mysql驱动包过旧导致MySQL Statement cancellation timer问题
作者:
一花一世界
,
2020-10-13 19:12:52
,
所有人可见
,
阅读 2219
1. 问题出现
系统程序通过jdbc驱动mysql连接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)
2.错误排查
最初以为是因为mysql资源未正常关闭引起,但是仔细检查代码后并未发现问题,后来在网上查阅资料,也众说纷纭。
试过很多解决方案,诸如修改配置文件、使用更换数据库连接池,但都未能解决问题。
3.问题解决
最近做另外一个新的项目,更换了mysql的驱动包,发现问题没有出现了,于是尝试着更换了原来的mysql驱动包,
问题解决掉了。
原来是因为,这是MySQL-Connector-Java的一个bug,在5.1.27版本以前MySQL Statement cancellation timer会导致Perm区Leak,内存泄漏后进而业务应用异常,具体参见 mysql bugs
解决了问题,大佬tcl
### 大佬