在做项目时遇到了这样的问题,当我重启项目时,出现了一个严重的警告:
信息: Reloading context [/MBMS1]
2012-9-9 17:10:24 org.apache.catalina.loader.WebappClassLoader clearReferencesJdbc
严重: The web application [/MBMS1] registered the JDBC driver [oracle.jdbc.driver.OracleDriver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
大概的意思就是: 当服务器停止时,注册的驱动没有被删除!导致了内存泄漏
详情 https://issues.apache.org/jira/browse/DBCP-332
解决办法:
1 重写close()方法 - 因为BasicDataSource的close方法没有删除驱动;
public class XBasicDataSource extends BasicDataSource {
@Override
public synchronized void close() throws SQLException{
// 当驱动没有注册时,没有必要删除 , 删除反而会报错
Driver driver = null;
try {
driver = DriverManager.getDriver(url);
} catch (SQLException e) {
System.out.println("driver is null");
}
if(driver!=null){
// 从 DriverManager 的列表中删除一个驱动程序。applet 只能注销取自其自身的类加载器的驱动程序。
DriverManager.deregisterDriver(driver);
super.close();
}
}
}
2 既然项目销毁时,会监听JDBC driver 我想就在项目销毁时把driver删除即可。
public class ApplicationListener implements ServletContextListener {
public void contextDestroyed(ServletContextEvent arg0) {
// 当服务器被关闭时 , 关闭数据库驱动 (注dbcp我项目中的XBasicDataSource对象)
try {
DBCPUtil.dbcp.close();
} catch (SQLException e) {
e.printStackTrace();
}
System.out.println("服务器关闭了 ,");
}
public void contextInitialized(ServletContextEvent arg0) {
System.out.println("服务器被启动了");
}
}
3 在web.xml文件中配置
<!-- 给 Application(服务器)配置监听器 --> <listener> <listener-class>zf.mbms.listener.ApplicationListener</listener-class> </listener>
三步即可完成 !