首頁 > Java > java教程 > 你應該在視圖模式中使用 Hibernate 的 Open Session 嗎?

你應該在視圖模式中使用 Hibernate 的 Open Session 嗎?

Mary-Kate Olsen
發布: 2024-11-25 10:39:15
原創
949 人瀏覽過

Should You Use Hibernate's Open Session in View Pattern?

Hibernate 在視圖模式中開啟會話的缺點

Hibernate 在視圖中開啟會話(OSIV) 模式在整個請求的整個過程中維護一個開啟會話生命週期。雖然這種方法看起來很方便,但它有幾個陷阱:

1。缺乏事務控制
OSIV 允許在託管事務之外進行資料操作,從而導致資料不一致。 UI 渲染期間執行的每個語句都以自動提交模式發生,這會增加 I/O 開銷並可能損害資料庫效能。

2.混合關注點
OSIV 模糊了服務層和 UI 層之間的分離,因為語句是由兩者產生的。這使得測試變得複雜,並且使得隔離層變得更加困難。

3. N 1 查詢效能問題
OSIV 將 UI 層限制為導航關聯,這可能會導致 N 1 查詢問題。雖然 Hibernate 提供了 @BatchSize 和 FetchMode.SUBSELECT 等緩解措施,但它們會影響預設的獲取計劃,並且可能並非適用於所有場景。

4.資源管理
OSIV 在整個 UI 渲染階段保持資料庫連線開啟。這種延長的連接租用可能會在連接池中造成擁塞,從而限制可擴展性和吞吐量。

OSIV 的替代方案

要在解決 OSIV 的限制的同時避免LazyLoadExceptions,請考慮以下這些替代策略:

  • 渴望取得:在服務層中急切地初始化所有必需的關聯,以避免延遲載入錯誤。
  • FetchMode.JOIN:在查詢中使用 FetchMode.JOIN 來急切地載入特定關聯。
  • 批次取得:利用@BatchSize批次取得關聯並改善
  • DTO 投影: 建立封裝相關資料的DTO(資料傳輸物件),而不包含惰性關聯。

在 Spring Boot 中停用 OSIV

在 Spring Boot 中,OSIV 預設為啟用。要停用它,請將以下屬性新增至您的application.properties 設定檔:

spring.jpa.open-in-view=false
登入後複製

透過停用OSIV,您可以更好地控制資料擷取、確保事務完整性並提高應用程式效能。

以上是你應該在視圖模式中使用 Hibernate 的 Open Session 嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板