一尘不染

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

java

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

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

任何帮助表示赞赏。


阅读 1461

收藏
2020-02-27

共1个答案

一尘不染

从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。

2020-02-27