問題:
問題:問題:
使用NHibernate 的語法使用Query相關集合會導致大量資料庫命中。這種行為主要出現在多對多關係中。
原因:public class UserRoleMap : ClassMap<UserRole> { public UserRoleMap() { Id(x => x.Id); Map(x => x.RoleName); HasManyToMany(x => x.UsersInRole) .Inverse() .LazyLoad() .Table("UsersInRoles"); } }
NHibernate 的急切獲取機制會針對關係的外鍵列中找到的每個不同值觸發單獨的查詢。當集合被標記為急切獲取但 ISession 不包含所有必需的物件時,會出現此問題。
示例映射:
假設您有以下內容data:
User1 有Role1
User2同時有 Role1 和 Role2HasManyToMany(x => x.UsersInRole) ... .BatchSize(25)使用 Fetch(x => x.UsersInRole) eager 檢索 UserRole 時,第一個查詢將擷取 User1 和 Role1。但是,由於會話不包含與 Role1 關聯的所有用戶,NHibernate 將執行多個額外查詢以獲取遺失的用戶,從而導致效能下降。 解決方案:建議的解決方案是使用NHibernate 的批量抓取機制,透過設定批量大小collection:將批次大小設定為25 或更高將導致NHibernate 為延遲載入集合一次檢索最多25 筆記錄。此優化將在初始查詢或最少數量的附加查詢中結合獲取集合,從而顯著減少資料庫命中。
以上是如何最佳化 NHibernate QueryOver 以避免在獲取相關集合時多次資料庫命中?的詳細內容。更多資訊請關注PHP中文網其他相關文章!