簡體   English   中英

Java Hibernate會話及其范圍?

[英]Java Hibernate session and its scope?

我剛剛開始將Hibernate與HSQLDB結合使用。 在教程中,他們告訴我不要使用反模式“每次操作會話”。 但是,每次提交事務時,會話也會關閉。 如果commit()關閉會話,我應該如何避免使用getCurrentSession()

我對人們通常如何處理會議范圍感到好奇。 我在構建Web應用程序時看到了幾個示例,其中每個請求一個會話。 就我而言,我正在構建服務,因此無法應用相同的想法。 該服務運行24/7,偶爾會執行一些數據庫操作。 我應該始終保持數據庫會話是活動的,只使用事務作為操作之間的邊界(考慮我的事務提交不關閉會話的情況)或者我應該為每個操作創建一個新的(這是反...模式,但如何?)。

提前致謝!

該行為由正在使用的CurrentSessionContext的實現決定。 默認碰巧是ThreadLocalSessionContext ,它會在提交時關閉,但是您絕不會受限於此。

您可以通過在適當的生命周期的開始和結束時使用ManagedSessionContext並綁定/取消綁定會話來配置/構建所需的任何類型的會話范圍。 您似乎有意義的是,您將條目中的會話綁定到服務的工作單元,並在出口處解除綁定。 (為此,構建健壯的代碼當然不是一件容易的事。尤其要記住,如果從其中一種方法中產生異常,則應該進行新的Session 。)


對評論的回應太大了,無法發表評論。

這是默認行為,因為這是唯一“安全”的事情,無需用戶提供額外的工作或配置。 如果您不幫忙,那么“提交”是Hibernate能夠“看到”的唯一生命周期點,因此它必須在此關閉,否則可能會導致會話永遠懸而未決。

確定潛在的會話生命周期邊界需要對您實際執行的操作有相當多的了解。 “這是一項后台服務”沒什么可繼續的。 假設它像閑坐一樣每隔X分鍾醒來,做一些工作,然后再入睡X分鍾,那么打開然后關閉會話將是一個很好的界限。

當談論“每次操作的會話”是一種反模式時,您可能會使用“操作”的廣泛定義。

他們的意思是不要做(像你的服務的虛構要求):

  1. 叫醒服務
  2. 公開會議
  3. 從數據庫中讀取文件位置
  4. 關閉會話
  5. 打開文件
  6. 公開會議
  7. 從當前文件狀態更新數據庫表
  8. 關閉會話
  9. 公開會議
  10. 將活動日志寫入數據庫
  11. 關閉會話
  12. 睡眠服務

在一個會話中執行此操作然后在結束時關閉它是完全合理的。 在單線程環境中,您可以在已知邊界內自行管理所有內容,您可以自己打開和關閉會話,而無需使用currentSession 您只需要確保在發生異常時關閉它。 如果您正在偵聽操作系統事件,則事件處理將是會話的理想范圍。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM