3 回答
TA贡献1825条经验 获得超4个赞
/WEB-INF/lib
ServiceLoader
无视那些警告。托姆凯特做的很好。实际的bug在其他人的代码中(有问题的JDBC驱动程序),而不是在您的代码中。很高兴Tomcat正确地完成了它的工作,并等待JDBC驱动程序供应商修复它,以便您可以升级驱动程序。另一方面,您不应该将JDBC驱动程序放在webapp中 /WEB-INF/lib
,但仅限于服务器的 /lib
..如果你还把它放在webapp里 /WEB-INF/lib
,然后您应该手动注册并使用 ServletContextListener
.降级到Tomcat 6.0.23或更高版本,这样您就不会被这些警告所困扰。但它会悄无声息地漏掉记忆。不知道这到底是不是好消息。这种类型的内存泄漏是背后的主要原因之一。 OutOfMemoryError
问题 在Tomcat热部署期间。 将JDBC驱动程序移动到Tomcat /lib
文件夹,并有一个连接池数据源来管理驱动程序。请注意,Tomcat的内置DBCP在关闭时没有正确地取消注册驱动程序。参见bug DBCP-322 作为WONTFIX关闭。您希望将DBCP替换为另一个连接池,它比DBCP做得更好。例如 HikariCP ,BoneCP ,或者也许 TomcatJDBC池 .
TA贡献2019条经验 获得超9个赞
然而,全面取消司机登记的方法是危险的。DriverManager.getDrivers()
public final void contextDestroyed(ServletContextEvent sce) { // ... First close any background tasks which may be using the DB ... // ... Then close any DB connection pools ... // Now deregister JDBC drivers in this context's ClassLoader: // Get the webapp's ClassLoader ClassLoader cl = Thread.currentThread().getContextClassLoader(); // Loop through all drivers Enumeration<Driver> drivers = DriverManager.getDrivers(); while (drivers.hasMoreElements()) { Driver driver = drivers.nextElement(); if (driver.getClass().getClassLoader() == cl) { // This driver was registered by the webapp's ClassLoader, so deregister it: try { log.info("Deregistering JDBC driver {}", driver); DriverManager.deregisterDriver(driver); } catch (SQLException ex) { log.error("Error deregistering JDBC driver {}", driver, ex); } } else { // driver was not registered by the webapp's ClassLoader and may be in use elsewhere log.trace("Not deregistering JDBC driver {} as it does not belong to this webapp's ClassLoader", driver); } }}
添加回答
举报