package com.revolsys.ui.web.servlet.listener; import java.beans.Introspector; import java.io.IOException; import java.lang.management.ManagementFactory; import java.net.MalformedURLException; import java.net.URL; import java.sql.Driver; import java.sql.DriverManager; import java.util.Enumeration; import javax.management.InstanceNotFoundException; import javax.management.ObjectName; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import com.revolsys.logging.Logs; public class DriverManagerCleanupListener implements ServletContextListener { @Override public void contextDestroyed(final ServletContextEvent event) { final ClassLoader classLoader = getClass().getClassLoader(); try { final Enumeration<Driver> drivers = DriverManager.getDrivers(); while (drivers.hasMoreElements()) { try { final Driver driver = drivers.nextElement(); final Class<? extends Driver> driverClass = driver.getClass(); if (driverClass.getClassLoader() == classLoader) { DriverManager.deregisterDriver(driver); } try { // Cleanup Oracle MBean final ObjectName objectname = new ObjectName( "com.oracle.jdbc:type=diagnosability,name=" + classLoader.getClass().getName() + "@" + Integer.toHexString(classLoader.hashCode())); ManagementFactory.getPlatformMBeanServer().unregisterMBean(objectname); } catch (final InstanceNotFoundException e) { } } catch (final Throwable e) { Logs.error(this, "Failed to cleanup ClassLoader for webapp", e); } } } catch (final Throwable e) { Logs.error(this, "Failed to cleanup ClassLoader for webapp", e); } finally { Introspector.flushCaches(); } } @Override public void contextInitialized(final ServletContextEvent event) { try { new URL("file:///").openConnection().setDefaultUseCaches(false); } catch (final MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (final IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }