Tomcat热部署时出现无法注册JDBC驱动的解决方案
使用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 {@Overridepublic synchronized void close() throws SQLException {DriverManager.deregisterDriver(DriverManager.getDriver(url));super.close();}}
??然后修改application.xml中的配置为:
<bean id="dataSource" destroy-method="close">
?重新打包,再次进行热部署,没有出现该异常信息,问题解决。
?在此做下记录。
? ? ??