`
lr544463316
  • 浏览: 914 次
社区版块
存档分类
最新评论

(收藏自_xhr8334的空间_百度空间)由一个DEBUG说开去"CLOSE BY CLIENT STACK TRACE"

阅读更多
由一个DEBUG说开去
先交代一下背景。
昨天晚上一个群友在群里问我一个问题。他当时在给Oracle 10g配置C3P0连接池。最起初呢,这家伙用的是ojdbc14.jar。写法是标准的Spring的写法,但是就是不行。后来我说,你换个包。换成classes12.jar看看。顺利执行了。
话说,后来又出了一个问题。他问我说,执行是执行了,但是出现个新的问题。
XXXX(1234567890123456) 19:02:17
新问题又出来了
XXXX(1234567890123456) 19:02:28
NewPooledConnection - closed by a client.
java.lang.Exception: DEBUG -- CLOSE BY CLIENT STACK TRACE
at com.mchange.v2.c3p0.impl.NewPooledConnection.close(NewPooledConnection.java:566)
at com.mchange.v2.c3p0.impl.NewPooledConnection.close(NewPooledConnection.java:234)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.destroyRe
source(C3P0PooledConnectionPool.java:470)
at com.mchange.v2.resourcepool.BasicResourcePool$1DestroyResourceTask.run(BasicResourcePool.java:96
4)
at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.ja
va:547)
C3P0PooledConnectionPool - Successfully destroyed PooledConnection: com.mchange.v2.c3p0.impl.NewPool
我看到那个DEBUG,我说,是调试信息,修改一下LOG4J的等级就行了。
这个群友很不解的问,既然成功了,干嘛还要丢异常出来?
这里就不得不说到两个商业开发的原则问题了。
第一,对上家传入数据严加过滤,对传出给下家的数据仔细检查。
第二,合理使用异常。
第一点其实很简单的。也就是模块化开发的一个思想问题。对自己的行为负责。前端返回的数据究竟是什么,需要进行校验。不合格的剔除或者是修正。合格的处理完后,在传出之前也要加以校验,是否合格。
具体到这个问题里,就是来自Spring关于数据源的那个配置文件。
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
//略去数据源相关信息的配置
</bean>
这个配置文件里,有两个信息是很管用的。一个是class,一个是destroy-method。简单点说,一个是数据源的实现类,一个是析构方法。Spring在读取这个配置文件以后,需要根据这些信息来实例化一些类,然后内部再根据中间的那些配置信息来实际构造数据源。比如username啥的。
可是来了个问题。不能保证这里的ComboPooledDataSource数据源一定是可用的,也不能保证close方法一定能关闭连接,对吧?Spring本身不能检查这个类是否真实有效,毫无Bug。实际上呢,也检查不了。同样的,close方法是否有效,也需要进行检查。这就是我刚才说的,对上家数据的严加检查。
那好吧,怎么检查呢?最简洁的方法莫过于实际构造一下,连接池,获取数据库连接,执行一个测试语句,然后关闭连接。如果一切都成功,那就OK。关于那个测试语句,配置过WebSphere数据源的同学们还记得不?有个SQL语句会默认的写在数据源配置里,是 " SELECT 1 FROM TABLE "。嗯,对的,这个就是测试语句。
这一套流程能走得通,走的顺,那么就可以在自己能力范围内说这个数据源和连接池是能用的,对吧?
这里补充一个知识。java.sql.Connection,这玩意不是class,是interface。
声明是:public interface Connection extends Wrapper 。
任何一个JDBC数据库连接的实现类都应该实现这个接口的全部方法。比如,close。API里的描述是,立即释放此 Connection 对象的数据库和 JDBC 资源,而不是等待它们被自动释放。
熟悉Java的同学们应该记得一点,在规范里有个要求,就是接口的实现类必须实现接口的所有方法。但是呢,这句话还有个意思,那就是,你可以在实现所有方法之外,再写几个方法。没人会管你。
啊哈,那就有疑问了。虽然API规定了close是关闭连接释放资源的。但这只是你接口的一厢情愿。也许人家实现厂家觉得close方法不够帅,要改成closeConnection。那。。。Spring总不好傻傻的去死扣close方法来关闭连接吧?虽然这方法必须实现,但是可没说一定要有内容啊。如果是空方法呢?
所以有了destroy-method这个配置项的出现。Spring说,不碍的,您老人家看哪个爽,告诉我就行。
现在测试完了。一切都成功了。
现在来看看第二个问题。合理使用异常。
又遇到一个问题。既然测试成功了,那总得给用户一点交待吧?难道说,测试成功了,就闷声大发财了?显然不合适嘛。可以试想一下,你是程序员,然后点了个按钮,测试。结果呢,实际上是测试成功了,但是系统啥动静都不给你。然后你傻傻的等痴痴的盼,一直等到天荒地老……嗯嗯,扯的有点远。如果你等一个小时还不见动静,活不见人死不见尸的,你说你会不会骂娘?
那么怎么通知才能保证一定有效呢?println?这个不见得一定能看到。因为别人也可能在同时输出信息,一下就刷掉了。那么有同学说了,最好是能暂停一下,我输出以后,就暂停了,不动了。
嗯,很好。
大家想想看,输出一大堆东西,然后此程序不动了,不继续执行了,这是啥玩意?
这不就是异常嘛!
只有异常能保证程序员一定能看到这个信息,比如,测试成功。这就是为什么Spring要采用这种方式来通知的原因。
这里呢,我想更正同学们一个习惯成自然的想法。异常不一定是通知坏消息的。异常就是异常,只要你愿意,你甚至可以在代码执行成功的时候,throws一个Exception。异常只不过是比较激烈的一种通知方式而已。无他,仅此而已。
现在又有个问题来了。既然要测试,而且每次执行到此处的时候都要测试一下。那么……难道都卡在这里不走了啊?显然更不合适啊。
熟悉log4J的同学应该看出来了,这是log4J输出的日志。很明显的,这种日志只应当在开发期间存在,不应该在发布期间存在。因为开发期间数据库变动很大,比如改表啊,改数据库配置啊。所以需要通知用户是否成功。但是产品一旦开发完毕,正式发布,这种信息就不应再出现,因为商业化运作的应用不允许乱动配置的,对不?
所以log4J提供了一种方法。消息级别。INFO的时候,是看不到这个异常的。实现起来也很好办,catch了,然后不做任何处理,也就是空的catch块。
具体实现的时候可以在catch里判断一下,如果等级是INFO的话,就不做任何事。如果不是,那就按照规则去做。
结合到 “合理使用异常” 这句话来说呢,就是说,需要抛出异常的时候,就抛出。不需要抛出的时候,就不抛出。对程序员来说,在必要的时候看到一串异常信息,是最合适的事情了。
关于异常的使用,这里不展开说了。有兴趣的同学可以参见林锐博士的 高质量Java编程。
分享到:
评论

相关推荐

    xhr.zip_evidence5a8_thing1y8_xhr01_com_xhr11111.com_线性回归

    xhr.zip_evidence5a8_thing1y8_xhr01_com_xhr11111.com_线性回归这个压缩包文件包含了多个文件,主要涉及一个基于线性回归算法的预测模型。线性回归是一种广泛应用的统计学方法,用于研究两个或多个变量之间的关系,...

    transloadit_xhr:Transloadit的xhr文件上传实现

    但是,如果您想要一个轻量级的XHR实现,而没有官方jQuery插件的所有其他功能,那么此项目非常适合您。 例子: 首先在服务器后端构建参数和签名(以确保安全),然后调用upload()。 在开始之前,请确保相应地...

    XHR Proxy Tool插件(chrome浏览器)

    在现代Web开发中,跨域资源共享(CORS)成为了一个重要的议题,尤其是在进行API测试和开发时。XHR Proxy Tool是一款针对Chrome浏览器的插件,它为开发者提供了一种便捷的方式来解决跨域问题,使得开发者能够轻松地...

    JavaScript - XHR实现短信验证码注册登录完整示例:JavaScript - XHR.js和附件说明

    JavaScript - XHR(XMLHttpRequest)是Web开发中的一个重要工具,用于在不刷新整个页面的情况下与服务器进行异步数据交换,这种技术通常被称为AJAX(Asynchronous JavaScript and XML),虽然现在XML已经不是数据...

    ext-2.0.2含localXHR.rar

    这个名为"ext-2.0.2含localXHR.rar"的压缩包包含了ExtJS 2.0.2版本的一个特定更新,主要涉及到本地数据交互和帮助文档的改进。在本文中,我们将深入探讨这些关键知识点。 首先,我们要了解ExtJS 2.0.2。这是一个较...

    一个用于通过XHR2在浏览器上预加载资源的1kbJavaScript库

    总的来说,这个1kb的JavaScript预加载库是开发者工具箱中的一个强大武器,它利用了XHR2的先进功能,提供了轻量级、高效的解决方案,让开发者可以更智能地管理并控制网页资源的预加载过程。通过合理使用,可以显著...

    dotnet-叶子浏览器基于Cef访问网页时自动抓取结构化xhr数据

    标题中的“dotnet-叶子浏览器基于Cef访问网页时自动抓取结构化xhr数据”指出,这个项目是一个使用.NET框架开发的浏览器应用,名为“叶子浏览器”。它利用了Chromium Embedded Framework (Cef) 技术,实现了对网页的...

    前端开源库-mock-xhr

    例如,我们可以设置一个假的POST请求,返回一个预设的响应,这样在测试时就可以验证我们的代码如何处理这些特定的响应情况。 "mock-xhr"库提供了丰富的API和特性,包括但不限于以下几点: 1. **拦截请求**:可以...

    自己封的XHR,实现JAVA与JS直接通信

    自己封的XHR,实现JAVA与JS直接通信,起到连接JAVA与JS的桥梁,使用方法直接在JS中引入XhrAjax.js,传入参数带回返回值即可,但是要注意回调的时候要eval()激回一下返回值!

    XHR

    XHR 博文链接:https://eric2007.iteye.com/blog/213570

    XHR的简单封装xr.zip

    xr 是 XMLHttpRequest 的超简单封装,并返回 ES6 Promise。示例代码:xr.get('/api/items', {take: 5}) ... console.log("xhr", xhr);  console.log("progress", xhrProgressEvent);  }  } });

    xhr:一个小的xhr包装器

    API的一个子集这样你就可以在两个node.js中,通过使用浏览器的作品写的代码require('request')在你的代码,并告诉您的浏览器捆绑到加载xhr而不是request 。 对于browserify,将一个字段添加到package.json : ...

    前端项目-i18next-xhr-backend.zip

    【前端项目-i18next-xhr-backend.zip】是一个与前端国际化(i18n)相关的压缩包,其中包含了用于i18next的xhr后端层实现。i18next是广受欢迎的JavaScript国际化框架,它提供了强大的语言管理和翻译功能,支持多种...

    python-selenium-proxy-xhr.zip

    自动化模拟浏览器,打开网站,分析所有ajax / XHR请求,包含详细的response request数据。。。就是F12以后Network中xhr显示的数据。。。 采用python browsermobproxy selenium实现 ...有空写一个文章

    localXHR.js

    一个js脚本. 需要的人自然知道它是干什么的,呵呵 共享给需要的人

    nightwatch-xhr

    "Nightwatch-XHR" 是一个专门为 Nightwatch 测试框架扩展的模块,专注于处理XMLHttpRequest(XHR)请求。这个工具使得在 Nightwatch 中进行异步接口的测试变得更加方便和直观,适用于自动化前端应用的接口和功能测试...

    localXHR

    Ext2.0文档下载后在本地不能阅读,下载localXHR.js放在docs目录下然后在index.html中加入&lt;script src="localXHR.js"&gt;,要放在extall.js后面。

    QQ空间相册POST上传

    QQ空间相册POST上传是一种常见的网络编程操作,主要用于在QQ空间中通过编程方式上传个人的图片至相册。这一过程涉及到网页代码的学习,尤其是HTTP请求的相关知识,特别是POST方法的应用。POST请求是HTTP协议中的一种...

    AngularJS入门教程05:XHR和依赖注入

    【AngularJS入门教程05:XHR和依赖注入】 很多AngularJS初学者看到中文入门教程,却无法使用GitHub下载到配套的Angular的Seed工程,因此学习曲线大。在此专门下载配套工程打包分享给大家。 本集教程地址: ...

    无限维空间中的点_以留园为例_解析步移景异的空间涵义[收集].pdf

    【标题】:“无限维空间中的点_以留园为例_解析步移景异的空间涵义” 【摘要】:本文探讨了“步移...留园正是这种设计理念的精彩实例,它以其独特的空间构造,为人们提供了一个深入了解和体验“步移景异”的理想场所。

Global site tag (gtag.js) - Google Analytics