2013-03-26 59 views
20

当tomcat关闭时,我在catalina.out日志文件中得到以下消息。我正在使用Tomcat 7.x和Tomcat JDBC数据源。tomcat7 - jdbc datasource - 这很可能会造成内存泄漏

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. 

第一个声称数据源已被强制注销,因此没有问题。然而,这很奇怪,因为我已经配置了这样的破坏方法:

<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相关问题仍然存在

+0

可能重复[如何解决内存泄漏问题?](http://stackoverflow.com/questions/10615118/how-to-solve-memory-leak-problems) – OhadR 2016-12-12 12:45:21

+0

请参阅此注释以了解有关MySQL的更多信息取消线程问题。 https://stackoverflow.com/a/46733027/185565 – Whome 2017-10-13 15:16:08

+0

https://stackoverflow.com/a/47019335/3408531 – TiMr 2017-10-30 16:04:06

回答

27

尝试将sql连接器/驱动程序放在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

+0

谢谢。看到我编辑的问题 – arahant 2013-03-26 08:27:29

+0

你还使用其他libray的? – Zelldon 2013-03-26 08:35:19

+0

nope。 DataSource是由Tomcat 7提供的。驱动程序来自MySql Connector/J。最重要的是,我有Spring JDBC,但我想这与此问题无关。除此之外,没有其他数据库相关的库。 – arahant 2013-03-26 08:38:34