tomcat7 - jdbc datasource - 这很可能会造成内存泄漏

时间:2013-03-26 08:06:03

标签: mysql spring memory-leaks tomcat7 datasource

当tomcat关闭时,我在catalina.out日志文件中收到以下消息。我正在使用Tomcat 7.x和Tomcat JDBC数据源。

Mar 26, 2013 1:17:52 PM org.apache.catalina.loader.WebappClassLoader clearReferencesJdbc 
SEVERE: The web application [/my_webapp] 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. 
Mar 26, 2013 1:17:52 PM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads 
SEVERE: The web application [/my_webapp] 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.

第一个声称DataSource已被强制取消注册,因此很好。但是很奇怪因为我已经像这样配置了destroy-method:

<bean name="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource" destroy-method="close">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
    <property name="username" value="root"/>
    <property name="password" value="password"/>
</bean>  

不知道为什么我得到第二个。关于“MySQL语句取消计时器”的一个。

感谢任何帮助

编辑1: 我尝试了@Zelldon建议的修复,它摆脱了第一个错误。但是MySQL Statement Cancellation Timer相关问题仍然存在

3 个答案:

答案 0 :(得分:34)

尝试将sql Connector / Driver放在tomcat / lib中而不是在war中。 因为每次部署战争时都会创建连接器/驱动程序,有时垃圾收集器无法删除它们,这将以内存泄漏结束。因此,尝试在tomcat / lib文件夹上移动连接器。

请阅读以下答案:

Why must the JDBC driver be put in TOMCAT_HOME/lib folder?

How to configure Tomcat to connect with MySQL

答案 1 :(得分:1)

它可能与MySQL jdbc连接器中的这个错误有关:http://bugs.mysql.com/bug.php?id=65909

您可以等待MySQL团队修复它,或者您尝试使用适用于MySQL的Drizzle JDBC connector(您只需更改url连接中的参数),并且在我的测试中,不会没有这种错误。

答案 2 :(得分:0)

我也遇到了同样的问题,我只是将mysql-connector-java的pom版本从8.0.16回滚到8.0.15,问题得以解决,我认为这是连接器版本之间的不匹配和mysql导致了问题