Hibernate Open Session in View:一種有爭議的實踐
Open🎜>
Open🎜>OSIV 的問題
OSIV 提出了一些挑戰:
- OSIV🎜> OSIV🎜> OSIV🎜> OSIV🎜> OSIV🎜> OSIV🎜> OSIV🎜> OSIV🎜> OSIV🎜> OSIV🎜> OSIV🎜> OSIV🎜> OSIV🎜> OSIV🎜> OSIV 保持會話期地開放,繞過典型的交易生命週期。這可能會導致意想不到的後果,例如資料一致性問題。
- 資料庫效能下降:保持會話開啟會對資料庫造成壓力,因為在回應處理期間執行的任何其他語句(例如,惰性關聯初始化)以自動提交模式發出。
- 模糊層分離: OSIV 模糊了業務層和 UI 渲染階段之間的關注點分離,使得應用程式的測試和維護變得困難。
- 增加連線租用時間:會話可以保持開放狀態延長時間,限制資料庫連線池的資源。
替代方案策略
為了避免這些問題,開發者可以採用替代策略:
- 顯式初始化惰性關聯:使用Join 初始化服務層中的惰性關聯Fetch 或FetchMode.SUBSELECT。
- 建立單獨的 DAO查詢: 為 UI 層編寫特定的 DAO 查詢,這些查詢專門用於僅獲取必要的關聯。
- 使用視圖投影: 建立僅傳回所需的基本欄位的投影UI 而不是完整的實體。
- 使用 FetchMode.LAZY 和 EAGER Loading: 設定FetchMode.LAZY 用於不立即需要的實體,FetchMode.EAGER 用於必須預先載入的關聯。
在 Spring Boot 中停用 OSIV
Spring Boot 啟用 OSIV預設。若要停用它,請在 application.properties 檔案中設定以下屬性:spring.jpa.open-in-view=false
此設定可確保 Hibernate 會話在每個服務層事務後關閉,從而防止與 OSIV 相關的潛在缺陷。
以上是Hibernate Open Session in View:使用或不使用?的詳細內容。更多資訊請關注PHP中文網其他相關文章!