To prevent a memory leak, the JDBC Driver has been forcibly unregistered

后端 未结 14 1709
执念已碎
执念已碎 2020-11-22 02:15

I am getting this message when I run my web application. It runs fine but I get this message during shutdown.

SEVERE: A web application registered the

14条回答
  •  野性不改
    2020-11-22 02:57

    Solution for per-app deployments

    This is a listener I wrote to solve the problem: it autodetects if the driver has registered itself and acts accordingly.it

    Important: it is meant to be used ONLY when the driver jar is deployed in WEB-INF/lib, not in the Tomcat /lib, as many suggest, so that each application can take care of its own driver and run on a untouched Tomcat. That is the way it should be IMHO.

    Just configure the listener in your web.xml before any other and enjoy.

    add near the top of web.xml:

    
        utils.db.OjdbcDriverRegistrationListener    
    
    

    save as utils/db/OjdbcDriverRegistrationListener.java:

    package utils.db;
    
    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 oracle.jdbc.OracleDriver;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    /**
     * Registers and unregisters the Oracle JDBC driver.
     * 
     * Use only when the ojdbc jar is deployed inside the webapp (not as an
     * appserver lib)
     */
    public class OjdbcDriverRegistrationListener implements ServletContextListener {
    
        private static final Logger LOG = LoggerFactory
                .getLogger(OjdbcDriverRegistrationListener.class);
    
        private Driver driver = null;
    
        /**
         * Registers the Oracle JDBC driver
         */
        @Override
        public void contextInitialized(ServletContextEvent servletContextEvent) {
            this.driver = new OracleDriver(); // load and instantiate the class
            boolean skipRegistration = false;
            Enumeration drivers = DriverManager.getDrivers();
            while (drivers.hasMoreElements()) {
                Driver driver = drivers.nextElement();
                if (driver instanceof OracleDriver) {
                    OracleDriver alreadyRegistered = (OracleDriver) driver;
                    if (alreadyRegistered.getClass() == this.driver.getClass()) {
                        // same class in the VM already registered itself
                        skipRegistration = true;
                        this.driver = alreadyRegistered;
                        break;
                    }
                }
            }
    
            try {
                if (!skipRegistration) {
                    DriverManager.registerDriver(driver);
                } else {
                    LOG.debug("driver was registered automatically");
                }
                LOG.info(String.format("registered jdbc driver: %s v%d.%d", driver,
                        driver.getMajorVersion(), driver.getMinorVersion()));
            } catch (SQLException e) {
                LOG.error(
                        "Error registering oracle driver: " + 
                                "database connectivity might be unavailable!",
                        e);
                throw new RuntimeException(e);
            }
        }
    
        /**
         * Deregisters JDBC driver
         * 
         * Prevents Tomcat 7 from complaining about memory leaks.
         */
        @Override
        public void contextDestroyed(ServletContextEvent servletContextEvent) {
            if (this.driver != null) {
                try {
                    DriverManager.deregisterDriver(driver);
                    LOG.info(String.format("deregistering jdbc driver: %s", driver));
                } catch (SQLException e) {
                    LOG.warn(
                            String.format("Error deregistering driver %s", driver),
                            e);
                }
                this.driver = null;
            } else {
                LOG.warn("No driver to deregister");
            }
    
        }
    
    }
    

提交回复
热议问题