异常 A web application registered the JBDC driver

A web application registered the JBDC 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.


一.
一个web应用程序注册的JBDC驱动程序[com.mysql.jdbc.Driver],但Web应用程序时停止时未能注销。为了防止内存泄漏,JDBC驱动程序已被强行注册。
解决办法 :
在服务器保持运行的状态中,redeploy这个项目, 就出现了异常,
要stop之后 再redeploy,就可以了【先将tomcat kill掉,等进程完全死了,再重新启动】
二.
tomcat 6.0.33启动时,报错
he web application [/aaa] registered the JDBC driver [com.ibm.db2.jcc.DB2Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.

在网上搜索得知,一般是项目应用到了SSH组合会出这种问题,多半是Hibernate版本问题。

原因是Hibernate3.2.3已经包含hibernate-annotations-3.2.1.GA.jar,错误在于我重新加入了Annotation.jar等jar文件 ,一般如果用集成开发环境,如Eclipse,MyEclipse等,他会自带有hibernate等框架的jar包,如果我们自己再加入相同的框架(但版本不同)的jar包,就容易引起冲突【这个方法没有试,具体去掉哪些包,不知道。。。】
三.
经查发现开发环境的tom为6.0.20,而出错的生产环境为6.0.29(据查6.0.24、6.0.26均会出现此问题)遂重装tomcat6.0.20解决,此问题的tom只要不高过6.0.20都可以,如6.0.18【没有试验】
四.
使用Sping org.apache.commons.dbcp.BasicDataSource 配置数据源时警告
SEVERE: A web application registered the JBDC 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.
问题是tomcat的版本问题,tomcat新检测机制导致的这个问题,换版本可以解决问题,但不建议这么做,租用服务器不是你说换就换的。
其实问题根源是BasicDataSource,BasicDataSource类close()的一个Bug。
BasicDataSource's method close() doesn't deregister JDBC driver. This causes permgen memory leaks in web server environments, during context reloads. For example, using Tomcat 6.0.26 with Spring, and BasicDataSource declared in Spring context, there is a message printed at web application reload:
SEVERE: A web application registered the JBDC 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.
上面是问题,翻译的不好,自己看英文吧。
解决方法:
继承org.apache.commons.dbcp.BasicDataSource 重写close()
import java.sql.DriverManager;
import java.sql.SQLException;

import org.apache.commons.dbcp.BasicDataSource;

public class FixedBasicDataSource extends BasicDataSource {

@Override
public <T> T unwrap(Class<T> iface) throws SQLException {
// TODO Auto-generated method stub
return null;
}

@Override
public boolean isWrapperFor(Class<?> iface) throws SQLException {
// TODO Auto-generated method stub
return false;
}
@Override
public synchronized void close() throws SQLException {
DriverManager.deregisterDriver(DriverManager.getDriver(url));
super.close();
}

}

然后用 FixedBasicDataSource 替换spring配置文件中的数据源bean的class【我用的c3p0的数据库连接池的包】
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这是一条警告信息,意思是在 Web 应用程序停止时,虽然已经注册了 JDBC 驱动程序 [oracle.jdbc.oracledriver],但未能注销它。为了防止内存泄漏,强制注销了 JDBC 驱动程序。 ### 回答2: 这段话的意思是,在 web 应用程序停止时,虽然已经成功地注册了 Oracle 数据库的 JDBC 驱动程序 [oracle.jdbc.oracledriver],但是在停止时未能成功注销该驱动程序,从而导致可能会导致内存泄漏的情况发生。为了避免这种情况的发生,系统将强制注销该 JDBC 驱动程序。 JDBC 驱动程序是一种连接数据库的工具,它可以让我们建立连接、发送 SQL 命令、获取和处理查询结果。在 web 应用程序中,我们通常会把 JDBC 驱动程序注册到应用程序中,以便我们在需要访问数据库时能够正常使用它。 然而,当 web 应用程序停止时,我们也需要注销已经注册的 JDBC 驱动程序,以便释放相关的资源,避免内存泄漏的情况发生。如果我们没有正确注销 JDBC 驱动程序,就有可能会造成系统资源的浪费,从而影响应用程序的性能和稳定性。 以上述情况为例,系统检测到在停止 web 应用程序时未能成功注销已经注册的 JDBC 驱动程序,因此就会强制注销该驱动程序,以避免内存泄漏的情况发生。这样做可以保证系统的稳定性和安全性,避免不必要的资源浪费,提高应用程序的性能。 ### 回答3: 该消息是在Web应用程序停止时由Tomcat服务器系统自动生成的警告消息。 JDBC是Java Database Connectivity的缩写,是Java程序用于在数据库中执行操作的API集合。当应用程序运行时,必须先将JDBC驱动程序注册到JVM的内存中,以便在需要连接到数据库时在应用程序和数据库之间建立通信。该警告消息指出,在注册了JDBC驱动程序以后,当web应用程序停止时未成功注销它,因而可能导致内存泄漏的风险。 内存泄漏是指有一个运行中的程序使用了系统的内存资源,但是在使用过程中并未正确释放资源,导致系统中的内存资源被无限制地占用,最终可能导致系统崩溃。在本例中,应用程序在注册JDBC驱动程序成功后,未正确地注销JDBC驱动程序,导致被占用的JVM内存越来越多,并可能在长时间运行的情况下导致内存不足,程序执行出现错误。 为了避免这种情况的发生,在web应用程序停止时,Tomcat服务器系统强制注销该JDBC驱动程序,以释放占用的系统内存资源。因此,如果您看到了这个消息,您应该检查您的应用程序代码,确保在应用程序运行期间,所有注册的JDBC驱动程序在应该注销它们的时候都进行了正确的注销。这是一个很小的问题,但是如果不及时处理,可能会导致应用程序的严重错误,影响到应用程序的稳定性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值