首頁 > 資料庫 > mysql教程 > 如何最佳化 NHibernate QueryOver 以避免在獲取相關集合時多次資料庫命中?

如何最佳化 NHibernate QueryOver 以避免在獲取相關集合時多次資料庫命中?

Mary-Kate Olsen
發布: 2025-01-04 13:19:40
原創
232 人瀏覽過

How Can I Optimize NHibernate QueryOver to Avoid Multiple Database Hits When Fetching Related Collections?

使用Fetch 克服NHibernate QueryOver 中的多個SQL 查詢

問題:

問題:

問題:

使用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 和 Role2

HasManyToMany(x => x.UsersInRole)
    ...
    .BatchSize(25)
登入後複製
使用 Fetch(x => x.UsersInRole) eager 檢索 UserRole 時,第一個查詢將擷取 User1 和 Role1。但是,由於會話不包含與 Role1 關聯的所有用戶,NHibernate 將執行多個額外查詢以獲取遺失的用戶,從而導致效能下降。

解決方案:建議的解決方案是使用NHibernate 的批量抓取機制,透過設定批量大小collection:將批次大小設定為25 或更高將導致NHibernate 為延遲載入集合一次檢索最多25 筆記錄。此優化將在初始查詢或最少數量的附加查詢中結合獲取集合,從而顯著減少資料庫命中。

以上是如何最佳化 NHibernate QueryOver 以避免在獲取相關集合時多次資料庫命中?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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