先交代一下背景。

昨天晚上一个群友在群里问我一个问题。他当时在给Oracle 10g配置C3P0连接池。最起初呢,这家伙用的是ojdbc14.jar。写法是标准的Spring的写法,但是就是不行。后来我说,你换个包。换成classes12.jar看看。顺利执行了。

话说,后来又出了一个问题。他问我说,执行是执行了,但是出现个新的问题。

XXXX(1234567890123456) 19:02:17
新问题又出来了

XXXX(1234567890123456) 19:02:28

NewPooledConnection - com.mchange.v2.c3p0.impl.NewPooledConnection@1285252 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
edConnection@1285252

我看到那个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编程。

转:

http://hi.baidu.com/xhr8334/blog/item/cf15d1a6deb235fc9052ee9b.html

转载于:https://www.cnblogs.com/thingsoft/archive/2011/08/01/2123604.html

由一个DEBUG说开去相关推荐

  1. 一起谈.NET技术,从.NET中委托写法的演变谈开去(中):Lambda表达式及其优势...

    在上一篇文章中我们简单探讨了.NET 1.x和.NET 2.0中委托表现形式的变化,以及.NET 2.0中匿名方法的优势.目的及注意事项.那么现在我们来谈一下.NET 3.5(C# 3.0)中,委托的 ...

  2. C#在类型实例化时都干了什么:从一道笔试题说开去

    C#在类型实例化时都干了什么:从一道笔试题说开去 原文来自:http://www.cnblogs.com/instance/archive/2011/05/27/2059409.html 前一阵子我参 ...

  3. 从.NET中委托写法的演变谈开去(中):Lambda表达式及其优势

    在上一篇文章中我们简单探讨了.NET 1.x和.NET 2.0中委托表现形式的变化,以及.NET 2.0中匿名方法的优势.目的及注意事项.那么现在我们来谈一下.NET 3.5(C# 3.0)中,委托的 ...

  4. 【原创】从罗胖子关于开会的议题说开去

    从罗胖子关于开会的议题说开去 最近忽然喜欢上了罗胖子,昨天看了他的<罗辑思维>,是关于开会得方面的知识,感觉很有收获,同时也对他推荐的<罗伯特议事规则>挺感兴趣,目前先加在我的 ...

  5. 一线城市与三线城市的IT生活——从《机器灵 砍菜刀》说开去

    一线城市与三线城市的IT生活                                                       --从<机器灵 砍菜刀>说开去 最近山东济宁地区的 ...

  6. CAAI演讲实录丨李德毅院士:交互认知——从图灵测试的漏洞谈开去

    8月26日至27日,在中国科学技术协会.中国科学院的指导下,由中国人工智能学会发起主办.中科院自动化研究所与CSDN共同承办的2016中国人工智能大会(CCAI 2016)在北京辽宁大厦盛大召开,这也 ...

  7. CMDN Club #20 活动预告: 从粉笔网多终端产品快速开发说开去——移动创业产品的架构和项目管理(10月10日)...

    CMDN Club # 20: 从粉笔网多终端产品快速开发说开去--移动创业产品的架构和项目管理 5个程序员,3个月,30多万行代码,1000+bug,粉笔网快速开发的故事 粉笔网今年4月16日开始策 ...

  8. 从微软、FB、华为的网络安全备忘录说开去

    从三篇网络安全备忘录说开去前言微软facebook华为国家层面引申阅读 前言 各大公司的网络安全备忘录是一种内外沟通的策略,备忘录形式多样有邮件.公开信.博文,不同于产品上具体的白皮书来宣称企业提供的 ...

  9. 晋升答辩,leader嫡系拿着我和另一个同事的项目去答辩,关键我们三个人是同一组答辩,这也太恶心了吧?...

    职场上有多少不公平现象? 一位网友吐槽:晋升答辩,leader嫡系拿着我和另一个同事的项目去答辩,关键我们三个人是同一组答辩,这也太恶心了吧? 网友说,这不就等于抄袭了吗? 有人说,脏活累活干完了,还 ...

  10. 【CCAI 2016】李德毅院士:交互认知——从图灵测试的漏洞谈开去

    8月26日至27日,在中国科学技术协会.中国科学院的指导下,由中国人工智能学会发起主办.中科院自动化研究所与CSDN共同承办的2016中国人工智能大会(CCAI 2016)在北京辽宁大厦盛大召开,这也 ...

最新文章

  1. MVVM开发模式MVVM Light Toolkit中使用事件和参数传递
  2. ACMNO.30 C语言-宏交换 定义一个带参的宏,使两个参数的值互换,并写出程序,输入两个数作为使用宏时的实参。输出已交换后的两个值。
  3. python diango 并发_利用gunicorn提高django的并发能力
  4. php使用webuploader表单上传文件覆盖文件key doesn't match with scope的问题和解决思路
  5. mysql 授权是哪一个表_MySQL授权系统的五个表
  6. VS中修改站点运行方式(集成 Or 经典)
  7. javascript 里Array的一些方法
  8. 如何在spring框架中解决多数据源的问题[转]
  9. imx8qm HDMI-TX调试
  10. DynamipsGUI笔记
  11. 系统无法联系dhcp服务器,Win10专业版解决无法联系DHCP服务器错误[Ipconfig / Renew]方法...
  12. Vivado2018【编辑器设置黑色背景】
  13. 关于分频和倍频(转)
  14. repeat()方法
  15. 国投瑞银创新基金对基金市场有何影响
  16. 解决了:微信小程序使用canvas绘制倒计时圆圈和数字居中的实现
  17. 关于umeditor粘贴图片自动上传
  18. python默认参数举例_Python中的默认参数详解
  19. 在线相册 ,图片上传, 基于 Spring boot vuejs element ui mysql 的项目
  20. 用计算机模拟勇气号,成功登陆火星的“勇气”号探测器text阅读答案

热门文章

  1. 语言混编之java调用c_Java通过JNI调用C语言库
  2. trunc函数_这几个舍入函数你都会用吗?
  3. 电脑下边的任务栏不见了_Win7系统电脑任务栏经常自动消失不见的解决方法
  4. Arduino 函数-IO输出输入
  5. C# TextBox输入数字 TextBox输入限制 TextBox输入字符 KeyPress
  6. mysql 重放binlog_【MySQL】老版本重放binlog的罕见报错
  7. oracle不完全恢复类型,Oracle——不完全恢復
  8. latex中怎么设置每一行文字都对齐_LaTeX技巧870:Latex如何在设置行距后让字体垂直居中?...
  9. CentOS7搭建FTP文件服务器
  10. SQL Server查询所有的表名、字段名、注释