使用Hudson做CI,进行自动部署时,出现如下异常:
The web application [/XXX] 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
项目使用的数据库连接池是common-dbcp,然后在网上搜了一把,原因是从tomcat6.0.24之后加入了防止内存泄漏的机制,但是把server.xml中的<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />注释掉并不管用。
后来在https://issues.apache.org/jira/browse/DBCP-332中找到解决方案,那就是重写BasicDataSource的close方法:
package com.ourcompany.util;
import java.sql.DriverManager;
import java.sql.SQLException;
import org.apache.commons.dbcp.BasicDataSource;
/**
* @ClassName: OurDataSource
* @Description: TODO(这里用一句话描述这个类的作用)
* @author
*/
public class OurDataSource extends BasicDataSource {
@Override
public synchronized void close() throws SQLException {
DriverManager.deregisterDriver(DriverManager.getDriver(url));
super.close();
}
}
然后修改application.xml中的配置为:
<bean id="dataSource" class="com.wafersystems.util.OurDataSource" destroy-method="close">
重新打包,再次进行热部署,没有出现该异常信息,问题解决。
在此做下记录。