返回
顶部

修改密码

首页 > 文章 > 体育 > 正文
为了防止内存泄漏,jdbc驱动程序已强制取消注册

+1

-1

收藏

+1

-1

点赞1

评论0

标题:为了防止内存泄漏,jdbc驱动程序已强制取消注册
详情介绍-作者:xiaowei-来源: 极全网-官网 -如有问题点击:在线客服帮助

针对每个应用部署的解决方案

这是我为解决这个问题而写的一个侦听器:它自动检测驱动程序是否注册了自己并采取相应的行动,它就会自动检测。

重要提示:仅当驱动程序jar被部署在WEB-INF / lib中,而不是像Tomcat / lib那样部署时才会使用,因此每个应用程序都可以处理它自己的驱动程序,并运行在未触发的Tomcat上。

需要先在web.xml中配置侦听器。

顶部web.xml:

<listener>
    <listener-class>utils.db.OjdbcDriverRegistrationListener</listener-class>    </listener>

存为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<Driver> 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");
        }
    }}


版权声明:本文内容由极全网实名注册用户自发贡献,版权归原作者所有,极全网-官网不拥有其著作权,亦不承担相应法律责任。具体规则请查看《极全网用户服务协议》和《极全网知识产权保护指引》。如果您发现极全网中有涉嫌抄袭的内容,点击进入填写侵权投诉表单进行举报,一经查实,极全网将立刻删除涉嫌侵权内容。

扫一扫在手机打开

评论
已有0条评论
0/150
提交
热门评论
相关推荐
换一批
热点排行