`
liyixing1
  • 浏览: 962094 次
  • 性别: 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"通常...

    Z-Stack 3.0.2-.7z.zip_Z-STACK 3.0.2_Z-STACK-3.0.2_z-stack 3_z-st

    Z-Stack 3.0.2 是一个专为物联网(IoT)设计的网络协议栈,它由Zigbee联盟开发并广泛应用于智能家居、智能能源、工业自动化等领域。Zigbee是一种低功耗、低成本、自组织的无线通信技术,支持多跳网络,能构建大规模...

    Android studio 出现错误Run with --stacktrace option to get the stack trace. Run with --info or --debu

    主要介绍了 Android studio 出现错误Run with --stacktrace option to get the stack trace. Run with --info or --debu的相关资料,需要的朋友可以参考下

    f-stack-server-client.rar

    【标题】"f-stack-server-client.rar" 是一个包含F-stack客户端和服务器端实现代码的压缩文件,这为我们提供了一个深入理解F-stack网络框架如何在实际应用中处理客户端和服务器通信的绝佳机会。F-stack通常是一个高...

    前端项目-stacktrace.js.zip

    《深入理解前端项目-stacktrace.js》 在前端开发中,错误处理是不可或缺的一部分,而堆栈跟踪(Stack Trace)则是定位和解决问题的关键工具。本文将深入探讨stacktrace.js这一微型库,它允许我们在各种环境下获取...

    Atom-stacktrace,用于导航stacktraces的atom包。通过在github上创建一个帐户为smashwilson/stacktrace开发做出贡献。.zip

    Atom-stacktrace是一款专门为Atom文本编辑器设计的插件,它主要功能是帮助用户更有效地浏览和导航程序中的堆栈跟踪(stacktraces)。这个插件由开发者smashwilson在GitHub上维护,允许社区成员通过贡献来持续改进其...

    前端开源库-atma-loader-stacktrace

    "atma-loader-stacktrace"是一个专为前端开发者设计的开源库,其核心功能是处理和增强JavaScript运行时的堆栈跟踪信息。这个库的主要目标是为编译和缩小后的脚本提供清晰、有用的堆栈跟踪,帮助开发者更好地诊断和...

    redis-stack-server 7.2.0 安装包合集

    redis-stack-server-7.2.0-v9.arm64.snap redis-stack-server-7.2.0-v9.bionic.arm64.tar.gz redis-stack-server-7.2.0-v9.bionic.x86_64.tar.gz redis-stack-server-7.2.0-v9.bullseye.x86_64.tar.gz redis-stack-...

    Z-Stack 3.0.2.zip

    Z-Stack 3.0.2是Texas Instruments(TI)发布的一个重要的无线网络协议栈,专为Zigbee通信协议设计。Zigbee是一种低功耗、短距离、自组织的无线网络技术,广泛应用于智能家居、工业自动化、智能电网等领域。Z-Stack...

    JCL_Debug_StackTrace_Demo

    标题“JCL_Debug_StackTrace_Demo”表明这是一个关于使用JCL进行调试和显示堆栈跟踪的示例项目。堆栈跟踪是在程序运行时记录函数调用序列的一种技术,它可以帮助开发者迅速定位错误发生的具体位置。在Delphi7中,JCL...

    MTK-stack-and-stack-management-.rar_Stack_history

    "MTK-stack-and-stack-management-.rar_Stack_history"这个压缩包文件似乎着重于介绍MTK(MediaTek)芯片平台上的屏幕栈历史管理,特别是从空闲屏幕(Idle Screen)过渡到主菜单(Main Menu)屏幕,以及如何回退到...

    Z-Stack 3.0.2.rar

    Z-Stack是TI(德州仪器)公司推出的一套针对Zigbee协议栈的软件开发套件,它允许开发者构建符合Zigbee 3.0规范的网络。在这个场景中,我们讨论的是Z-Stack 3.0.2版本,这是针对CC2530微控制器的特定实现。 CC2530是...

    boost-stacktrace-1.66.0-10.el8.i686.rpm

    官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装

    redis-stack-server-6.2.6-v7.rhel7.x86-64.tar.gz

    这里的 "redis-stack-server-6.2.6-v7.rhel7.x86-64.tar.gz" 文件是一个针对 Red Hat Enterprise Linux 7 (RHEL7) 平台的 64 位版本的 Redis Stack 6.2.6 包。这个压缩包包含了运行 Redis Stack 所需的所有组件,...

    前端开源库-eslint-config-callstack-io

    **前端开源库-eslint-config-callstack-io** 在前端开发领域,保持代码质量和一致性是至关重要的。`eslint-config-callstack-io` 是一个开源库,专门用于帮助开发者实现这一目标。它提供了预设的 ESLint 配置,结合...

    博客管理系统-毕业设计_my-stack-back-end.zip

    博客管理系统-毕业设计_my-stack-back-end

    Debug---Eclipse

    标题中的"Debug---Eclipse"指的是在Eclipse集成开发环境中进行调试的相关知识。Eclipse是一款广泛使用的开源Java IDE,它提供了强大的调试工具,使得开发者能够有效地查找和修复代码中的错误。接下来,我们将深入...

    c-stack-trace-src.zip

    标题 "c-stack-trace-src.zip" 暗示这是一个与C语言有关的项目,特别是关于堆栈跟踪(stack trace)的源代码。堆栈跟踪是编程中一个关键的调试工具,它允许程序员查看程序执行过程中的函数调用序列,帮助定位问题...

Global site tag (gtag.js) - Google Analytics