终结守卫者模式在HashMap关系数据映射技术软件PVO中的应用

本文探讨了在HashMap关系数据映射技术软件PVO中使用终结守卫者模式来关闭数据库连接的方法。虽然通常建议使用try-finally结构进行资源回收,但在PVO中采用终结函数作为最后一道安全防线是必要的,尤其是在面对不规范的编程实践时。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

终结守卫者模式在HashMap关系数据映射技术软件PVO中的应用
通常我们应当避免使用终结函数finalize来回收资源,应当使用try-finally结构来完成需要资源及时回收的任务。很多权威专家给了我们明确的指示。对此,我完全赞同,作为一名严谨的Java程序员应当严格遵守这一原则。
但是,在PVO中,为什么要坚持用finalize来关闭数据库连接呢?
首先,能不能用finalize来关闭数据库连接,就是一个十分敏感的话题,也是一个十分复杂的问题。PVO在最初的设计中,就恰恰采用了这样作法,其思想出发点是:希望用finalize来作为最后一道安全防线,以保证资源回收。而这样的作法却受到不少网友的质疑。我曾不止一次的问自己,难道错了吗?为什么会有这么多人的疑问?
为了能彻底回答这一问题,我对此作了长期的跟踪。大量的实践证明,作为一个通用的简化JDBC数据库编程工具,坚守这最后一道防线是必须的。为什么?
1、 在现实中有大量的程序代码,只是使用了普通的try-catch结构来处理数据库的操作。这样的作法大量充斥在Java书籍、或网络文章中,而采用try-finally的作法非常的少。而try-catch却无法确保能及时关闭数据库连接,尤其是在web应用中。很难想像大家都会严格按照原则去办事。
2、 不习惯使用、不愿使用、忘记使用try-finally的多种情况是存在的,始终做到一丝不苟很难。Java异常处理机制保证了Java程序的健壮性,但需要程序员去认真地做,才能发挥它的出色的机能。
针对这些客观存在的问题,PVO不仅必须要坚守最后一道安全防线,而且要出色地完成所坚守的任务。
避免使用终结函数,只是一个一般性的指导原则,并不代表绝对不能使用。为什么会有这么多人的疑问?我估计是深受《Java核心技术》的影响,《Java核心技术》中有关垃圾收集的内容只有寥寥数行,只是给了一个一般性的建议,并没有对其作深刻的分析。
面对客观实际,在PVO这个通用的JDBC程序设计中,针对数据库连接,坚守在最后关头用finalize关闭数据库连接是恰到好处的作法,不应当说是不对的做法。这种做法不仅在实践中得到证实,而且还可以从一部权威性著作《Effective Java Programming Language Guide》中得到强有力的支持(说明:作者Joshua Bloch是Sun公司的高级工程师,也是“Java平台核心组”的设计师)。在“第六条:避免使用终结函数”中,作者指出:“那么终结函数有什么好处呢?它们有两个合理的用途。第一种用途是,当一个对象的所有者忘记了调用显式终止方法的情况下,终结函数可以充当‘安全网(safety net)’。虽然这样做并不能保证终结函数被及时地调用,但是在客户无法通过调用显式的终止方法来正常结束操作的情况下(希望这种情形尽可能少发生),迟一点释放关键资源总比永远不释放要好。”
当然,我从这部著作中,学习到了一个更好的作法:“终结守卫者”,这是一个更安全的作法。因此,在最近一次修订的PVO_v1.2中,欣然接受了这个“终结守卫者”。
在PVO核心类ProcessVO.java中的代码如下:
   private final Object finalizerGuardian = new Object() {
    protected void finalize() throws Throwable {
      try {
      }
      finally {
        if (con != null) {
          if (!con.isClosed()) {
            con.close();
            System.out.println(
                "Connection closed in finalize,You should close it.");
          }
        }
      }
    }
  };
   
最后,依然要说明的是:针对具体的数据库编程任务,请不要依赖“终结守卫者”来关闭连接,而应当坚持使用try-finally及时关闭数据库连接。这如同在足球场,球员首先应当挡住对方的进攻,实在挡不住,那就只有依靠守门员了。
如果您对PVO感兴趣,欢迎访问“HashMap关系数据映射技术”专业网站 http://www.aisun.cn
 
附:有关观点可参考以下著作
《Effective Java Programming Language Guide》(中文版) ([美]Joshua Bloch 著 机械工业出版社)
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值