3 回答

TA貢獻(xiàn)1825條經(jīng)驗(yàn) 獲得超4個(gè)贊
/WEB-INF/lib
ServiceLoader
無視那些警告。托姆凱特做的很好。實(shí)際的bug在其他人的代碼中(有問題的JDBC驅(qū)動程序),而不是在您的代碼中。很高興Tomcat正確地完成了它的工作,并等待JDBC驅(qū)動程序供應(yīng)商修復(fù)它,以便您可以升級驅(qū)動程序。另一方面,您不應(yīng)該將JDBC驅(qū)動程序放在webapp中 /WEB-INF/lib
,但僅限于服務(wù)器的 /lib
..如果你還把它放在webapp里 /WEB-INF/lib
,然后您應(yīng)該手動注冊并使用 ServletContextListener
.降級到Tomcat 6.0.23或更高版本,這樣您就不會被這些警告所困擾。但它會悄無聲息地漏掉記憶。不知道這到底是不是好消息。這種類型的內(nèi)存泄漏是背后的主要原因之一。 OutOfMemoryError
問題 在Tomcat熱部署期間。 將JDBC驅(qū)動程序移動到Tomcat /lib
文件夾,并有一個(gè)連接池?cái)?shù)據(jù)源來管理驅(qū)動程序。請注意,Tomcat的內(nèi)置DBCP在關(guān)閉時(shí)沒有正確地取消注冊驅(qū)動程序。參見bug DBCP-322 作為WONTFIX關(guān)閉。您希望將DBCP替換為另一個(gè)連接池,它比DBCP做得更好。例如 HikariCP ,BoneCP ,或者也許 TomcatJDBC池 .

TA貢獻(xiàn)2019條經(jīng)驗(yàn) 獲得超9個(gè)贊
然而,全面取消司機(jī)登記的方法是危險(xiǎn)的。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); } }}
添加回答
舉報(bào)