帶有Fetch 的NHibernate QueryOver:解釋多個SQL 查詢和資料庫命中
嘗試使用NHibernate 的QueryOver 來擷取相關清單時語法上,開發人員可能會遇到大量冗餘的SQL 查詢和資料庫命中。使用急切獲取時會出現此問題。
請考慮以下程式碼:
Session.QueryOver<UserRole>() .Fetch(x => x.UsersInRole).Eager .List();
此查詢將導致一系列資料庫命中,包括:
此行為源自於 NHibernate 的急切獲取策略。啟用急切取得後,相關集合將與父實體一起立即載入。但是,每個相關物件可能具有需要檢索的不同關聯,從而導致額外的查詢。
在提供的對應範例中,UserRole 和 UsersInRole 實體具有多對多關係。當急切地獲取具有此關係的 UserRoles 時,會話將僅包含有關檢索到的 UserRole 的信息,而不包含其關聯的 UsersInRole 的信息。
為了緩解此問題,應採用批量獲取。透過在集合映射上設定 BatchSize 屬性,NHibernate 將批次檢索相關實體,而不是為每個關聯對象執行單獨的查詢。
解決方案:
HasManyToMany(x => x.UsersInRole) ... .BatchSize(25)
為兩個集合映射(包括類別映射)分配批次大小可確保執行多個查詢,而不是執行大量冗餘查詢。確切的查詢數量將取決於批量大小和頁面大小設定。
以上是為什麼 Eager Fetching 的 NHibernate QueryOver 會導致多次資料庫查詢?的詳細內容。更多資訊請關注PHP中文網其他相關文章!