当前位置: 首页 > 面试题库 >

Java 为防止内存泄漏,已强制注销JDBC驱动程序

薛弘济
2023-03-14
问题内容

运行Web应用程序时,我收到此消息。它运行正常,但是我在关机期间收到此消息。

严重:Web应用程序注册了JBDC驱动程序[oracle.jdbc.driver.OracleDriver],但在Web应用程序停止时未能注销它。为了防止内存泄漏,已强制注销JDBC驱动程序。

任何帮助表示赞赏。


问题答案:

从6.0.24版本开始,Tomcat附带了内存泄漏检测功能,当webapp中存在与JDBC 4.0兼容的驱动程序时,该漏洞又会导致这种警告消息,该驱动程序会在使用API启动webapp/WEB-INF/lib自动进行注册,但是在webapp关闭期间未自动注销自身。该消息纯粹是非正式的,Tomcat已经采取了相应的内存泄漏预防措施。ServiceLoader

你能做什么?

  1. 忽略那些警告。Tomcat正在正确地执行其工作。实际的错误是在别人的代码(有问题的JDBC驱动程序)中,而不是你的代码中。对Tomcat能够正确完成工作感到高兴,并等待JDBC驱动程序供应商对其进行修复,以便你可以升级驱动程序。另一方面,你不应该在Webapp的JDBC驱动程序中删除JDBC驱动程序/WEB-INF/lib,而在服务器的/lib。如果你仍将其保留在webapp的目录中/WEB-INF/lib,则应使用进行手动注册和注销ServletContextListener。

  2. 降级到Tomcat 6.0.23或更早的版本,这样你就不会被那些警告所困扰。但是它会默默地保持泄漏内存。毕竟不确定这是否很好。此类内存泄漏是Tomcat热部署期间OutOfMemoryError问题背后的主要原因之一。

  3. 将JDBC驱动程序移至Tomcat/lib文件夹,并具有连接池数据源来管理驱动程序。请注意,Tomcat的内置DBCP在关闭时无法正确注销驱动程序。另请参见错误DBCP-322,该错误已作为WONTFIX关闭。你想用另一个连接池代替DBCP,该连接池比DBCP做得更好。例如HikariCP,BoneCP或Tomcat JDBC Pool。



 类似资料:
  • 我知道这个问题以前被问过很多次,但没有一个解决方案对我有效。 [警告][][javax.enterprise.web.util][tid:_Threadid=18_ThreadName=RunLevelControllerThread-1473348595597][TimeMillis:1473348603791][LevelValue:900][[web应用程序[未知]注册了JDBC驱动程序[c

  • 问题内容: 我正在设计一个Web应用程序,该应用程序旨在显示一堆使用AJAX定期更新的数据。一般的使用场景是用户将整天保持打开状态,然后不时浏览一下。 我遇到的问题是浏览器的内存占用量随时间缓慢增长。Firefox和IE 7(尽管不是Chrome)都在发生这种情况。几个小时后,它可能导致IE7占用约200MB的内存,而FF3导致占用约400MB的内存。 经过大量测试,我发现只有在响应AJAX调用时

  • 我使用了Spark 2.1.1,并升级到了最新版本2.4.4。我从Spark UI观察到驱动程序内存在不断增加,在长时间运行之后,我出现了以下错误:java。lang.OutOfMemoryError:超出GC开销限制 在Spark 2.1.1中,驱动程序内存消耗(存储内存选项卡)极低,在运行ContextCleaner和BlockManager后,内存正在减少。 此外,我测试了Spark版本2.

  • 问题内容: 好的,所以我的程序有很多(〜300)线程,每个线程都与中央数据库通信。我创建了一个与数据库的全局连接,然后每个线程进行其业务创建语句并执行它们。 一路上的某个地方,我发生了大量内存泄漏。在分析堆转储之后,我看到com.mysql.jdbc.JDBC4Connection对象为70 MB,因为它在“ openStatements”(哈希映射)中有800,000个项目。在某个地方,它不能正

  • 当我们试图取消部署应用程序时,一些Oracle类似乎正在泄漏。在使用旧的OJDBC14.jar驱动程序时,我没有看到这种情况,但我们不能使用这些驱动程序,因为我们正在迁移到Oracle11g,这需要更新的驱动程序。我猜这是Oracle驱动程序中的bug?我能做些什么来清理这些资源吗?我尝试关闭数据库连接池和其他东西,但没有成功... 我不使用Tomcat的连接池会更好吗?我们宁愿让服务器连接到数据

  • 问题内容: 由于Tomcat中的孤立线程,我遇到了内存泄漏。特别是,Guice和JDBC驱动程序似乎没有关闭线程。 我知道这与其他问题,但是就我而言,“不必担心”的答案是不够的,因为它给我带来了麻烦。我的CI服务器会定期更新此应用程序,重新加载6-10次后,由于Tomcat内存不足,CI服务器将挂起。 我需要能够清理这些孤立的线程,以便可以更可靠地运行CI服务器。任何帮助,将不胜感激! 问题答案: