首頁 > Java > java教程 > Hibernate 中的 Open Session in View (OSIV) 是不好的做法嗎?

Hibernate 中的 Open Session in View (OSIV) 是不好的做法嗎?

Barbara Streisand
發布: 2024-11-24 07:21:13
原創
326 人瀏覽過

Is Open Session in View (OSIV) in Hibernate a Bad Practice and What are the Alternatives?

為什麼在Hibernate 中在視圖中開啟會話是一種不好的做法

在視圖中開啟會話(OSIV) 是Hibernate中的一種模式,涉及保留會話在整個HTTP 請求中開啟。雖然這似乎有利於避免LazyLoadExceptions,但它引入了許多缺點:

資料庫視角問題:

  • 自動提交模式:由於事務是由服務層提交的,但在OSIV 中並未明確提交,因此UI渲染中的後續資料庫語句將以自動提交模式執行。這會要求頻繁刷新交易日誌,從而給資料庫伺服器帶來壓力。
  • 混合語句來源: OSIV 允許服務層和 UI 渲染進程同時產生語句,導致測試變得困難跨層資料庫互動。

程式碼複雜性與可擴充性問題:

  • UI 功能有限: OSIV 將UI 層限制為導航關聯,可能會觸發N 1 個查詢問題。
  • 連接持有: OSIV 可能會在整個UI 渲染過程中持有資料庫連接,從而增加連接租用時間並減少交易

Spring Boot 注意事項:

在Spring Boot 中,預設啟用OSIV。建議透過在應用程式設定中設定 spring.jpa.open-in-view=false 來停用它。

避免LazyLoadExceptions 的替代策略:

而不是OSIV,考慮:

  • 令人渴望關係:
  • 令人渴望關係:
  • 令人渴望關係:
  • 令人渴望關係急切地取得視圖層所需的關聯,確保在檢索實體時載入它們。
  • 在服務層明確取得:
  • 使用 fetch() 等方法在渲染視圖之前明確取得關聯。
  • 投影:
使用投影僅檢索視圖層所需的數據,避免不必要的延遲初始化。 Criteria API:利用 Criteria API 自訂查詢和急切地取得關聯。 實體圖: 定義實體圖以根據特定用例最佳化關聯檢索。

以上是Hibernate 中的 Open Session in View (OSIV) 是不好的做法嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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