Embora o Tomcat cancele o registro forçado do driver JDBC para você, é uma boa prática limpar todos os recursos criados pelo seu webapp na destruição de contexto, caso você mude para outro contêiner de servlet que não faça as verificações de prevenção de vazamento de memória que o Tomcat faz.
No entanto, a metodologia de cancelamento de registro geral do motorista é perigosa. Alguns drivers retornados pelo DriverManager.getDrivers()
método podem ter sido carregados pelo ClassLoader pai (ou seja, o carregador de classe do contêiner do servlet) e não pelo ClassLoader do contexto do aplicativo da web (por exemplo, eles podem estar na pasta lib do contêiner, não nos aplicativos da web e, portanto, compartilhados em todo o contêiner ) O cancelamento do registro desses afetará quaisquer outros aplicativos da web que possam estar usando-os (ou até o próprio contêiner).
Portanto, deve-se verificar se o ClassLoader de cada driver é o ClassLoader do webapp antes de cancelá-lo. Portanto, no método contextDestroyed () do seu ContextListener:
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);
}
}
}