MangoCool

doesn't deregister JDBC driver, causing memory leak

2015-11-03 15:37:54   作者:MangoCool   来源:MangoCool

The web application [/xxx] registered the JBDC driver [oracle.jdbc.OracleDriver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.

之前的项目中遇到这个问题,虽然不是很棘手,但是仍然需要引起注意。

问题原因:不注销jdbc驱动,很可能会造成内存泄露!

以下是我解决项目中内存泄漏的方法,Phoenix驱动注销代码:

public void destroy() {
        try {
            try {
                conn.close();
            } finally {
                try {
                    PhoenixDriver.INSTANCE.close();
                } finally {
                    DriverManager.deregisterDriver(PhoenixDriver.INSTANCE);
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        System.out.println("Phoenix destroy!");
    }

或者:

public void destroy() {
        try {
            try {
                conn.close();
            } finally {
                try {
                    PhoenixDriver.INSTANCE.close();
                } finally {
                    DriverManager.deregisterDriver(DriverManager.getDrivers().nextElement()); 
              }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        System.out.println("Phoenix destroy!");
    }
如果是基于tomcat做服务的,tomcat在关闭应用时,对资源做了一些清理,避免了泄露,这个工作主要是WebappClassLoader里做的,WebappClassLoader也实现自Lifecycle接口,在应用关闭时,会触发其stop方法:
@Override public void stop() throws LifecycleException {
     // Clearing references should be done before setting started to 
     // false, due to possible side effects 
     clearReferences(); ...... //自己实现清除工作;
}
当然你也可以在sping框架中配置,这样最简单方便:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="${jdbc.driver}" />
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
        <property name="validationQuery" value="SELECT 1" />
        <property name="testOnBorrow" value="true" />
</bean>


更多参考:http://stackoverflow.com/questions/3320400/to-prevent-a-memory-leak-the-jdbc-driver-has-been-forcibly-unregistered/6576394#6576394

Apache官方解决办法:https://issues.apache.org/jira/browse/DBCP-332

标签: JDBC 内存泄漏

分享:

上一篇错误: 找不到或无法加载主类 Files\apache-activemq-5.10.0\bin\..\conf\login.config

下一篇Netty框架简单示例

关于我

崇尚极简,热爱技术,喜欢唱歌,热衷旅行,爱好电子产品的一介码农。

座右铭

当你的才华还撑不起你的野心的时候,你就应该静下心来学习,永不止步!

人生之旅历途甚长,所争决不在一年半月,万不可因此着急失望,招精神之萎葸。

Copyright 2015- 芒果酷(mangocool.com) All rights reserved. 湘ICP备14019394号

免责声明:本网站部分文章转载其他媒体,意在为公众提供免费服务。如有信息侵犯了您的权益,可与本网站联系,本网站将尽快予以撤除。