2009-08-31 74 views

回答

2

您應該始終明確地關閉資源,而不要依賴GC /終結。

0

完全同意@Robert。不能強調,hibernate會話對象應該和JDBC連接一樣小心,你應該知道它在何時何地被打開以及在何時何地被關閉。

這當然是人們發現spring非常有用的原因之一,它提供了一個非常完整的框架來管理資源的生命週期,如jdbc連接和休眠會話。

0

如果您的實體是垃圾收集的,那麼沒有理由對會話進行GC分析。會話將在稍後或之後進行。

例如,如果我存儲在一個靜態的列表到會話的引用,我可以運行幾個小時我的應用程序,實體將得到回收,但不是會議...

會議應明確地關閉。


如果你不喜歡在代碼中明確結束,我完全同意你的看法,和其他許多人也。 :-)

一個常見的解決方案是在框架代碼中進行關閉,即寫入一次的代碼,並將其應用於所有事務。它可能發生在超類中,例如,如果所有事務都是通過命令模式實現的。

但是,最常見的實現模式是使用AOP來處理這樣的全局問題。我們的項目使用Spring,它提供了即裝即用,以關閉所有的Hibernate Session(和關聯交易),具有更多功能的支持提交/回滾

  • 如果拋出一個異常,在關閉它之前調用事務回滾
  • 否則,會調用commit。