3 回答
TA贡献1825条经验 获得超4个赞
/WEB-INF/libServiceLoader
无视那些警告。托姆凯特做的很好。实际的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);
}
}}添加回答
举报
