package ee.telekom.workflow.web.util; import java.lang.invoke.MethodHandles; import java.sql.Driver; import java.sql.DriverManager; import java.sql.SQLException; import java.util.Enumeration; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Servlet context destory hook: de-register JDBC drivers to properly release resources. * * @author Christian Klock * @author Erko Hansar * @see http://stackoverflow.com/a/23912257/2767952 */ public class JdbcDriverDeregisterListener implements ServletContextListener{ private static final Logger log = LoggerFactory.getLogger( MethodHandles.lookup().lookupClass() ); @Override public void contextInitialized( ServletContextEvent sce ){ // nothing to do here } @Override public void contextDestroyed( ServletContextEvent sce ){ ClassLoader thisClassLoader = this.getClass().getClassLoader(); Enumeration<Driver> drivers = DriverManager.getDrivers(); while( drivers.hasMoreElements() ){ Driver driver = drivers.nextElement(); // only process drivers loaded by this web application if( driver.getClass().getClassLoader() == thisClassLoader ){ try{ log.info( "Deregistering JDBC driver {}", driver ); DriverManager.deregisterDriver( driver ); } catch( SQLException ex ){ log.error( "Error deregistering JDBC driver {}", driver, ex ); } } } } }