热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Thewebapplication[]registeredtheJDBCdriver[com.mysql.jdbc.Driver]butfailedtounregister

声明:本文转自mtgongren的博客,如有需要,请联系本作者。谢谢!暑假的时候做了一个项目,用的是SSHM

声明:本文转自mtgongren的博客,如有需要,请联系本作者。谢谢!

暑假的时候做了一个项目,用的是SSH+MySQL5.0+tomcat5.5

做完部署到服务器后(tomcat是6.0.32),测试正常运行。第二天发现无法登录了,检查了一遍系统没发现什么问题,重启tomcat后又恢复正常了。
很奇怪,于是查看tomcat的日志,发现如下问题:

2011-9-1 0:15:11 org.apache.catalina.startup.Catalina start
信息: Server startup in 35866 ms
2011-9-1 2:05:43 org.apache.coyote.http11.Http11Protocol pause
信息: Pausing Coyote HTTP/1.1 on http-8080
2011-9-1 2:05:44 org.apache.catalina.core.StandardService stop
信息: Stopping service Catalina
2011-9-1 2:05:44 org.apache.catalina.loader.WebappClassLoader clearReferencesJdbc
严重: The web application [] 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.
2011-9-1 2:05:45 org.apache.coyote.http11.Http11Protocol destroy
信息: Stopping Coyote HTTP/1.1 on http-8080

看报的异常信息是应用程序注册了JDBC驱动,但当程序停止时无法注销这个驱动,tomcat为了防止内存溢出,就给强制注销了。
上网搜,发现网上有不少关于这个问题的讨论,说是DBCP的bug。

详细如下:
https://issues.apache.org/jira/browse/DBCP-332

Description

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.

I was able to fix it by overriding close method this way:


view plain
  1. publicclassXBasicDataSourceextendsBasicDataSource{
  2. @Override
  3. publicsynchronizedvoidclose()throwsSQLException{
  4. DriverManager.deregisterDriver(DriverManager.getDriver(url));
  5. super.close();
  6. }
  7. }



but I think it should be probably the default behavior of BasicDataSource. Or perhaps there should be some flag/setting on BasicDataSource, named "deregisterDriverAtClose" or so.



我的系统没有用spring配置数据源。

tomcat从6.0.24版本之后引入了内存泄漏侦测的功能,当发现系统有垃圾无法回收时,就会输出日志信息。



看了很多关于这个问题的讨论,好像也没发现什么好的解决方法。有的说把tomcat的内存监听器关了就不会报这个异常,可是不报不等于没问题,依然无法解决啊。感觉应该是Hibernate的默认连接池对数据库连接的管理存在bug,其不会对连接是否有效进行检查,所以会出现异常。

在网上搜了关于Hibernate配置MySQL的资料,发现Mysql有个8小时问题,即系统如果超过8个小时没有被访问,mysql就会关闭空闲的Connection连接,而hibernate不会对连接是否有效进行检查,导致系统无法连接数据库。

在看了很多资料后,基本上可以确定是数据库连接的管理出了问题,用的是Hibernate3,配置数据库的时候用的是Hibernate默认的连接池,尝试更换成了Proxool连接池。

参考如下:


http://www.360doc.com/content/08/0101/10/53523_938529.shtml



3. proxool连接池



proxool跟c3p0以及dbcp不一样,它是自己生成连接的,因此连接信息放在proxool配置文件中。使用它时,需要将proxool-0.8.3.jar加入到classespath中。配置举例如下:



hibernate.cfg.xml




view plain
  1. xmlversion="1.0"encoding="UTF-8"?>
  2. "-//Hibernate/HibernateConfigurationDTD3.0//EN"
  3. "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
  4. <hibernate-configuration>
  5. <session-factory>
  6. <propertyname&#61;"show_sql">trueproperty>
  7. <propertyname&#61;"dialect">net.sf.hibernate.dialect.MySQLDialectproperty>
  8. >
  9. <propertyname&#61;"proxool.pool_alias">pool1property>
  10. <propertyname&#61;"proxool.xml">ProxoolConf.xmlproperty>
  11. <propertyname&#61;"connection.provider_class">net.sf.hibernate.connection.ProxoolConnectionProviderproperty>
  12. <mappingresource&#61;"com/amigo/pojo/User.hbm.xml"/>
  13. <mappingresource&#61;"com/amigo/pojo/Org.hbm.xml"/>
  14. session-factory>
  15. hibernate-configuration>





在hibernate.cfg.xml的同目录下编写proxool的配置文件&#xff1a;ProxoolConf.xml&#xff0c;该文件的配置实例如下&#xff1a;



ProxoolConf.xml




view plain
  1. xmlversion&#61;"1.0"encoding&#61;"utf-8"?>
  2. <driver-url>driver-url>
  3. <driver-class>driver-class>
  4. <driver-properties>
  5. <propertyname&#61;"user"value&#61;"…"/>
  6. <propertyname&#61;"password"value&#61;"…."/>
  7. driver-properties>
  8. <house-keeping-sleep-time>90000house-keeping-sleep-time>
  9. <maximum-new-connections>20maximum-new-connections>
  10. <prototype-count>5prototype-count>
  11. <maximum-connection-count>100maximum-connection-count>
  12. <minimum-connection-count>10minimum-connection-count>
  13. proxool>
  14. something-else-entirely>







按照上面讲的加入了Proxool0.9.1的jar包并配置好了&#xff0c;测试时却不通过&#xff0c;报没有jdbc connection的异常&#xff0c;奇怪。一个哥们和我一起按照上面的配置&#xff0c;他的却通过了&#xff0c;看了他的配置文件发现他的hibernate.cfg.xml里依然配置有数据库的连接信息&#xff0c;这个应该不需要了&#xff0c;因为在Proxool.xml里配置了啊。难道是因为这个&#xff0c;我也加上连接信息进行测试&#xff0c;结果正常登录&#xff0c;把系统日期往后调了几天再进行登录测试&#xff0c;又报了一开始的那个异常。很明显我配的这个连接池没有起作用&#xff0c;很奇怪。我哥们把他的Hibernate.cfg.xml里的数据库连接配置去掉后&#xff0c;他的依然可以运行通过&#xff0c;而且系统调时间后也可以运行&#xff0c;说明这个连接池起作用了&#xff0c;问题终于算是解决了&#xff0c;很高兴。可是我们的代码是一样的&#xff0c;对比了各自的配置文件也都是一样的啊&#xff0c;为什么在我这不起作用呢&#xff1f;很是郁闷&#xff0c;难道是人品的问题&#xff1f;&#xff01;不会的&#xff0c;我人品应该还可以啊&#xff0c;可是残酷的现实就摆在眼前。。。。。。不管了&#xff0c;都中午一点多了&#xff0c;午饭还没吃呢&#xff0c;去吃饭。

在学校外面的兰州拉面馆吃了碗牛肉刀削面&#xff0c;回来后还是想着这个问题&#xff0c;搁心里憋的慌。想了一会&#xff0c;觉得应该还是Hibernate.cfg.xml和proxool.xml配置文件的问题&#xff0c;于是我把哥们的这两个配置文件拷贝到我的系统里&#xff0c;把我的替换掉。运行通过。。。。。。晕死&#xff0c;配置文件的内容是我直接拷贝网页上的&#xff0c;可能存在一些字符问题。这样测试还是不放心&#xff0c;又把系统放到了一个小服务器上跑段时间看还会不会出现问题。

结果跑了几天后&#xff0c;依然正常。


推荐阅读
  • 本文探讨了如何通过一系列技术手段提升Spring Boot项目的并发处理能力,解决生产环境中因慢请求导致的系统性能下降问题。 ... [详细]
  • 探讨ChatGPT在法律和版权方面的潜在风险及影响,分析其作为内容创造工具的合法性和合规性。 ... [详细]
  • 我有一个SpringRestController,它处理API调用的版本1。继承在SpringRestControllerpackagerest.v1;RestCon ... [详细]
  • 深入解析SpringMVC核心组件:DispatcherServlet的工作原理
    本文详细探讨了SpringMVC的核心组件——DispatcherServlet的运作机制,旨在帮助有一定Java和Spring基础的开发人员理解HTTP请求是如何被映射到Controller并执行的。文章将解答以下问题:1. HTTP请求如何映射到Controller;2. Controller是如何被执行的。 ... [详细]
  • 在编译BSP包过程中,遇到了一个与 'gets' 函数相关的编译错误。该问题通常发生在较新的编译环境中,由于 'gets' 函数已被弃用并视为安全漏洞。本文将详细介绍如何通过修改源代码和配置文件来解决这一问题。 ... [详细]
  • Python自动化测试入门:Selenium环境搭建
    本文详细介绍如何在Python环境中安装和配置Selenium,包括开发工具PyCharm的安装、Python环境的设置以及Selenium包的安装方法。此外,还提供了编写和运行第一个自动化测试脚本的步骤。 ... [详细]
  • 本文探讨了如何在Classic ASP中实现与PHP的hash_hmac('SHA256', $message, pack('H*', $secret))函数等效的哈希生成方法。通过分析不同实现方式及其产生的差异,提供了一种使用Microsoft .NET Framework的解决方案。 ... [详细]
  • 访问一个网页的全过程
    准备:DHCPUDPIP和以太网启动主机,用一根以太网电缆连接到学校的以太网交换机,交换机又与学校的路由器相连.学校的这台路由器与一个ISP链接,此ISP(Intern ... [详细]
  • 使用JS、HTML5和C3创建自定义弹出窗口
    本文介绍如何结合JavaScript、HTML5和C3.js来实现一个功能丰富的自定义弹出窗口。通过具体的代码示例,详细讲解了实现过程中的关键步骤和技术要点。 ... [详细]
  • 深入解析SSL Strip攻击机制
    本文详细介绍了SSL Strip(一种网络攻击形式)的工作原理及其对网络安全的影响。通过分析SSL与HTTPS的基本概念,探讨了SSL Strip如何利用某些网站的安全配置不足,实现中间人攻击,以及如何防范此类攻击。 ... [详细]
  • Windows 环境下安装 Git 并连接 GitHub 的详细步骤
    本文详细介绍了如何在 Windows 系统中安装 Git 工具,并通过配置 SSH 密钥实现与 GitHub 的安全连接。包括下载、安装、环境配置及验证连接等关键步骤。 ... [详细]
  • 首先我是刚接触JAVA,为了学JAVA,我在自己买了一本《精通Java-JDK、数据库系统开发、Web开发》王晓悦编著。书的内容我已经看完了,代码也亲自敲了一遍。但是还是觉得深入不进去,下一步在看什么 ... [详细]
  • 本文介绍了Java语言开发的远程教学系统,包括源代码、MySQL数据库配置以及相关文档,适用于计算机专业的毕业设计。系统支持远程调试,采用B/S架构,适合现代教育需求。 ... [详细]
  • 全能终端工具推荐:高效、免费、易用
    介绍一款备受好评的全能型终端工具——MobaXterm,它不仅功能强大,而且完全免费,适合各类用户使用。 ... [详细]
  • 本文将详细探讨 Linux 系统中的 netstat 命令,该命令用于查看网络状态和连接情况。通过了解 IP 地址和端口的基本概念,我们将更好地理解如何利用 netstat 命令来监控和管理网络服务。 ... [详细]
author-avatar
李伟祥祥
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有