今天在练习javaweb书城项目完成后,重新部署服务器(redeplory)突然报错
百度后得出以下原因: jdbc项目销毁时,驱动程序不会自动取消,项目重新部署时会有另一个驱动程序。
- 自6.0.24版以来,Tomcat附带了内存泄漏检测特性,当Webapp有一个兼容的驱动程序JDBC4.这将导致0驱动程序中的警告信息。/WEB-INF/lib的auto-register时使用ServiceLoaderAPI,但在webapp这不会在关机期间自动取消。实际的bug在别人的代码中(有问题)JDBC驱动程序),而不是在你的代码中。Tomcat正常工作,等待JDBC为了升级驱动程序,驱动程序供应商解决了问题。另一方面,你不应该webapp的/ WEB-INF / lib中放置JDBC只能在服务器/ lib中放置JDBC驱动程序。 假如你还存在webapp的/ WEB-INF / lib中,那么你应该使用ServletContextListener手动注册注销。
- 降级到Tomcat 6.0.23或更低的版本,这样你就不会被警告困扰。但它会悄悄地泄露内存。这些内存泄漏是Tomcat的OutOfMemoryError问题背后的主要原因之一。
- 将JDBC移动驱动程序Tomcat/lib有一个连接池数据源来管理驱动程序的文件夹。请注意,Tomcat的内置DBCP驱动程序在关闭时不会正确注销。另请参考WONTFIX关闭的bug DBCP-322。您可以将DBCP替换为另一个更好的DBCP连接池。例如HikariCP,BoneCP,或Tomcat JDBC池。
以上是错误报告的原因,直接忽略或减少tomcat版本感觉不太好,似乎治标不治本,或者掩耳盗铃,将JDBC的驱动程序放到tomcat的/lib,编写代码很不舒服,所以我最终选择添加监听器来手动取消驱动程序。
- 创建监听器
public class MyContextListener implements ServletContextListener {
@Override public void contextInitialized(ServletContextEvent arg0) {
System.out.println("webService start"); } @Override public void contextDestroyed(ServletContextEvent arg0) {
System.out.println("webService stop"); try {
while(DriverManager.getDrivers().hasMoreElements()) {
DriverManager.deregisterDriver(DriverManager.getDrivers().nextElement()); } System.out.println("jdbc Driver close");
AbandonedConnectionCleanupThread.checkedShutdown();
System.out.println("clean thread success");
} catch (SQLException e) {
e.printStackTrace();
}
}
}
- 在web.xml中声明监听器
- 成功解决