资讯详情

web注册了JDBC驱动程序 [com.mysql.cj.jdbc.Driver],但在Web应用程序停止时无法注销它

今天在练习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,编写代码很不舒服,所以我最终选择添加监听器来手动取消驱动程序。

  1. 创建监听器
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();
        }
    }
}
  1. 在web.xml中声明监听器
  2. 成功解决

标签: zz连接器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

 锐单商城 - 一站式电子元器件采购平台  

 深圳锐单电子有限公司