本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看<活动链接>
提问:如何解决“为了防止内存泄漏,已强制注销JDBC驱动程序”的报错?
运行Web应用程序时收到此消息。它运行时没有出现问题,但是我在关机过程中收到此消息。
SEVERE: A web application registered the JBDC 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.
期待您的帮助。
回答1:
从6.0.24版开始,Tomcat附带了内存泄漏检测功能,当webapp中存在与JDBC 4.0兼容的驱动程序时,该漏洞又会导致此类警告消息,该驱动程序会在使用ServiceLoader API启动webapp的过程/WEB-INF/lib中自动进行注册,但是在webapp关闭期间未自动注销自身。该消息纯粹是非正式的,Tomcat已经采取了相应的内存泄漏预防措施.
你能做什么?
1, 忽略那些警告。Tomcat正在正确地执行其工作。实际的错误是在别人的代码(有问题的JDBC驱动程序)中,而不是您的代码中。另一方面,您不应该在Webapp的JDBC驱动程序中删除JDBC驱动程序,而只能在server的JDBC API驱动程序中删除JDBC驱动程序。如果您仍将其保留在webapp的目录中,则应使用进行手动注册和注销ServletContextListener。
2, 降级到Tomcat 6.0.23或更早的版本,这样您就不会被那些警告所困扰。但是它会默默地保持内存泄漏。这或许不是个好建议。
3, 将JDBC驱动程序移至Tomcat的/lib文件夹,并具有连接池数据源来管理该驱动程序。请注意,Tomcat的内置DBCP在关闭时无法正确注销驱动程序。