為什麼在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中文網其他相關文章!