`
liyixing1
  • 浏览: 966923 次
  • 性别: Icon_minigender_1
  • 来自: 江西上饶
社区版块
存档分类
最新评论

DEBUG -- CLOSE BY CLIENT STACK TRACE

 
阅读更多
在单元测试测试环境下主要参数两个错误信息:
1.java.lang.Exception: DEBUG STACK TRACE for PoolBackedDataSource.close().
这是一个异常信息,在com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.close(AbstractPoolBackedDataSource.java:417)
方法中可以看到

public synchronized void close()
    {
        resetPoolManager();
        is_closed = true;
       
        C3P0Registry.markClosed(this);

        if (Debug.DEBUG && Debug.TRACE == Debug.TRACE_MAX && logger.isLoggable(MLevel.FINEST))
        {
            logger.log(MLevel.FINEST,
                    this.getClass().getName() + '@' + Integer.toHexString( System.identityHashCode( this ) ) +
                    " has been closed. ",
                    new Exception("DEBUG STACK TRACE for PoolBackedDataSource.close()."));
        }
    }

   if (Debug.DEBUG && Debug.TRACE == Debug.TRACE_MAX && logger.isLoggable(MLevel.FINEST))

这句判断中,只要log的debug级别打开,就可以确定会抛出这个Exception(奇怪的设计)。所以这个异常想要不出现,除了改log级别,没想到其他方式。

2.DEBUG -- CLOSE BY CLIENT STACK TRACE
[junit] java.lang.Exception: DEBUG -- CLOSE BY CLIENT STACK TRACE
    [junit]     at com.mchange.v2.c3p0.impl.NewPooledConnection.close(NewPooledConnection.java:566)
    [junit]     at com.mchange.v2.c3p0.impl.NewPooledConnection.close(NewPooledConnection.java:234)
    [junit]     at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.destroyResource(C3P0PooledConnectionPool.java:470)
    [junit]     at com.mchange.v2.resourcepool.BasicResourcePool$1DestroyResourceTask.run(BasicResourcePool.java:964)
    [junit]     at com.mchange.v2.resourcepool.BasicResourcePool.destroyResource(BasicResourcePool.java:989)
    [junit]     at com.mchange.v2.resourcepool.BasicResourcePool.access$100(BasicResourcePool.java:32)
    [junit]     at com.mchange.v2.resourcepool.BasicResourcePool$5.run(BasicResourcePool.java:1174)


c3p0的配置如下
<!-- 数据源配置 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<property name="driverClass" value="${connection.driver_class}" />
<property name="jdbcUrl" value="${jdbc.connection.url}" />
<property name="idleConnectionTestPeriod"
value="${jdbc.pool.c3p0.idle_connection_test_period}" />
<property name="preferredTestQuery" value="${jdbc.pool.c3p0.preferred_test_query}" />
<property name="maxIdleTime" value="${jdbc.pool.c3p0.max_idle_time}" />
<property name="properties">
<props>
<prop key="user">${jdbc.connection.username}</prop>
<prop key="password">${jdbc.connection.password}</prop>
<prop key="c3p0.acquire_increment">${jdbc.pool.c3p0.acquire_increment}</prop>
<prop key="c3p0.max_size">${jdbc.pool.c3p0.max_size}</prop>
<prop key="c3p0.min_size">${jdbc.pool.c3p0.min_size}</prop>
</props>
</property>
</bean>

这里原因主要和<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
这的destroy-method方法有关系。

Spring在读取这个配置文件以后,需要根据这些信息来实例化一些类,然后内部再根据中间的那些配置信息来实际构造数据源。
那么自然就不能保证这里的ComboPooledDataSource数据源一定是可用的,也不能保证close方法一定能关闭连接,对吧?Spring本身不能检查这个类是否真实有效,毫无Bug。实际上呢,也检查不了。同样的,close方法是否有效,也需要进行检查。

java.sql.Connection
public interface Connection extends Wrapper
任何一个JDBC数据库连接的实现类都应该实现这个接口的全部方法。比如,close。API里的描述是,立即释放此 Connection 对象的数据库和 JDBC 资源,而不是等待它们被自动释放。


     虽然API规定了close是关闭连接释放资源的。但这只是你接口的一厢情愿。也许人家实现厂家觉得close方法不够帅,要改成closeConnection。那。。。Spring总不好傻傻的去死扣close方法来关闭连接吧?虽然这方法必须实现,但是可没说一定要有内容啊。如果是空方法呢?所以有了destroy-method这个配置项的出现。

  总结:
     当不能确定destory-method的情况下,把该项删除,由程序自主选择关闭方法,这样Debug就不会报错了.


摘自http://csumissu.iteye.com/blog/1079576
分享到:
评论
2 楼 liyixing1 2013-12-13  
793059909 写道
destroy-method="close"这一行去除了,还是报错:
[2013-12-06 11:06:21,715] [C3P0PooledConnectionPoolManager[identityToken->2tl0n98y1iwg7cbdzzq7a|719f1f]-HelperThread-#2] DEBUG - com.mchange.v2.c3p0.impl.NewPooledConnection@484c6b closed by a client.
java.lang.Exception: DEBUG -- CLOSE BY CLIENT STACK TRACE
at com.mchange.v2.c3p0.impl.NewPooledConnection.close(NewPooledConnection.java:646)
at com.mchange.v2.c3p0.impl.NewPooledConnection.closeMaybeCheckedOut(NewPooledConnection.java:259)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.destroyResource(C3P0PooledConnectionPool.java:619)
at com.mchange.v2.resourcepool.BasicResourcePool$1DestroyResourceTask.run(BasicResourcePool.java:1024)
at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:648)



源码中NewPooledConnection
的close方法有

if ( cause == null )
            {
                this.invalidatingException = NORMAL_CLOSE_PLACEHOLDER;

                if ( logger.isLoggable( MLevel.FINEST ) )
                    logger.log( MLevel.FINEST, this + " closed by a client.", new Exception("DEBUG -- CLOSE BY CLIENT STACK TRACE") );

                logCloseExceptions( null, closeExceptions );

                if (closeExceptions.size() > 0)
                    throw new SQLException("Some resources failed to close properly while closing " + this);
            }
            else
            {
                this.invalidatingException = cause;
                if (Debug.TRACE >= Debug.TRACE_MED)
                    logCloseExceptions( cause, closeExceptions );
                else
                    logCloseExceptions( cause, null );
            }

这几句,可以看出来,close方法被调用,就一定有这个DEBUG级别的异常信息产生。
destroy-method="close"去除之后,容器(数据源管理器)本身不会再主动调用释放资源的方法,个人猜测,你产生的原因有可能是因为你虽然修改了配置,但是并没有反应到最后运行时候的配置文件中,或者其他地方依然再进行过主动释放资源并调用清理资源的方法。
1 楼 793059909 2013-12-06  
destroy-method="close"这一行去除了,还是报错:
[2013-12-06 11:06:21,715] [C3P0PooledConnectionPoolManager[identityToken->2tl0n98y1iwg7cbdzzq7a|719f1f]-HelperThread-#2] DEBUG - com.mchange.v2.c3p0.impl.NewPooledConnection@484c6b closed by a client.
java.lang.Exception: DEBUG -- CLOSE BY CLIENT STACK TRACE
at com.mchange.v2.c3p0.impl.NewPooledConnection.close(NewPooledConnection.java:646)
at com.mchange.v2.c3p0.impl.NewPooledConnection.closeMaybeCheckedOut(NewPooledConnection.java:259)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.destroyResource(C3P0PooledConnectionPool.java:619)
at com.mchange.v2.resourcepool.BasicResourcePool$1DestroyResourceTask.run(BasicResourcePool.java:1024)
at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:648)

相关推荐

    C3P0连接池jar包.zip

    在给定的"**C3P0连接池jar包.zip**"中包含的"c3p0-0.9.5.2.jar"是C3P0的一个版本,用于解决特定的问题,例如"DEBUG -- CLOSE BY CLIENT STACK TRACE"。 这个错误信息"DEBUG -- CLOSE BY CLIENT STACK TRACE"通常...

    Bochs - The cross platform IA-32 (x86) emulator

    - bugfix: close images on exit - SB16 - converted the sound output module stuff to the new 'soundmod' plugin - SF patches applied [3164945] hack to compile under WIN64 by Darek Mihocka and ...

    JLink_Windows_V648.zip

    DLL: Windows: Renesas RX: When using FINE interface and disabling ongoining debug mode on debug session close, it could happen that a thread was not exited gracefully, causing handle leaks. Fixed. DLL...

    php.ini-development

    data to the client. If your application's output exceeds this setting, PHP ; will send that data in chunks of roughly the size you specify. ; Turning on this setting and managing its maximum buffer ...

    CE中文版-启点CE过NP中文.exe

    Fixed several issues where minimizing a window and then close it would hang CE Fixed file scanning Fixed crashes when editing memory in some some emulators Additions and changes: Text editor ...

    BobBuilder_app

    RaptorDB starts off by loading the page list and it is good to go from there and pages are loaded on demand, based on usage. Page Splits In the event of page getting full and reaching the ...

Global site tag (gtag.js) - Google Analytics