2009-08-31 44 views

回答

2

您应该始终明确地关闭资源,而不要依赖GC /终结。

0

完全同意@Robert。不能强调,hibernate会话对象应该和JDBC连接一样小心,你应该知道它在何时何地被打开以及在何时何地被关闭。

这当然是人们发现spring非常有用的原因之一,它提供了一个非常完整的框架来管理资源的生命周期,如jdbc连接和休眠会话。

0

如果您的实体是垃圾收集的,那么没有理由对会话进行GC分析。会话将在稍后或之后进行。

例如,如果我存储在一个静态的列表到会话的引用,我可以运行几个小时我的应用程序,实体将得到回收,但不是会议...

会议应明确地关闭。


如果你不喜欢在代码中明确结束,我完全同意你的看法,和其他许多人也。 :-)

一个常见的解决方案是在框架代码中进行关闭,即写入一次的代码,并将其应用于所有事务。它可能发生在超类中,例如,如果所有事务都是通过命令模式实现的。

但是,最常见的实现模式是使用AOP来处理这样的全局问题。我们的项目使用Spring,它提供了即装即用,以关闭所有的Hibernate Session(和关联交易),具有更多功能的支持提交/回滚

  • 如果抛出一个异常,在关闭它之前调用事务回滚
  • 否则,会调用commit。