Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // This manually deregisters JDBC driver, which prevents Tomcat 7 from complaining about memory leaks wrto this class
- Enumeration<Driver> drivers = DriverManager.getDrivers();
- while (drivers.hasMoreElements()) {
- Driver driver = drivers.nextElement();
- try {
- DriverManager.deregisterDriver(driver);
- LOG.log(Level.INFO, String.format("deregistering jdbc driver: %s", driver));
- } catch (SQLException e) {
- LOG.log(Level.SEVERE, String.format("Error deregistering driver %s", driver), e);
- }
- }
- 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);
- }
- }
- }
- <listener>
- <listener-class>com.mysite.MySpecialListener</listener-class>
- </listener>
- public class MySpecialListener implements ServletContextListener {
- @Override
- public void contextInitialized(ServletContextEvent sce) {
- // On Application Startup, please…
- // Usually I'll make a singleton in here, set up my pool, etc.
- }
- @Override
- public void contextDestroyed(ServletContextEvent sce) {
- // On Application Shutdown, please…
- // 1. Go fetch that DataSource
- Context initContext = new InitialContext();
- Context envContext = (Context)initContext.lookup("java:/comp/env");
- DataSource datasource = (DataSource)envContext.lookup("jdbc/database");
- // 2. Deregister Driver
- try {
- java.sql.Driver mySqlDriver = DriverManager.getDriver("jdbc:mysql://localhost:3306/");
- DriverManager.deregisterDriver(mySqlDriver);
- } catch (SQLException ex) {
- logger.info("Could not deregister driver:".concat(ex.getMessage()));
- }
- // 3. For added safety, remove the reference to dataSource for GC to enjoy.
- dataSource = null;
- }
- }
- <dependency>
- <groupId>mysql</groupId>
- <artifactId>mysql-connector-java</artifactId>
- <version>5.1.18</version>
- <!-- put a copy in /usr/share/tomcat7/lib -->
- <scope>provided</scope>
- </dependency>
- /**
- * Destroys the servlet cleanly by unloading JDBC drivers.
- *
- * @see javax.servlet.GenericServlet#destroy()
- */
- public void destroy() {
- String prefix = getClass().getSimpleName() +" destroy() ";
- ServletContext ctx = getServletContext();
- try {
- Enumeration<Driver> drivers = DriverManager.getDrivers();
- while(drivers.hasMoreElements()) {
- DriverManager.deregisterDriver(drivers.nextElement());
- }
- } catch(Exception e) {
- ctx.log(prefix + "Exception caught while deregistering JDBC drivers", e);
- }
- ctx.log(prefix + "complete");
- }
- dataSource {
- pooled = true
- jmxExport = true
- driverClassName = "org.h2.Driver" // make this one comment
- username = "sa"
- password = ""
- }
Add Comment
Please, Sign In to add comment