簡體   English   中英

Nhibernate和Unitwork模式的性能非常差

[英]Very poor performance by Nhibernate & Unitwork pattern

我有一個像這樣的復雜物體

 A
|
|
|                 |->C(As child)---->it has 4 hastomany properties(each B has 10000 C child)
B(has many child)->
                  |->D(As child)---->it has 4 hastomany properties(each B has 1o000 D child)
                  |->B Has many prop also
|
|
|A has many prop also

我,我的表現受苦。 總的來說,在檢索此記錄時,我可以預期Nh會觸發1000-2000個查詢。 但是NH 10-20K的最差性能正在射擊。

在這里,我只是在實體A上進行讀寫。 我不會單獨插入A的任何孩子,也不會檢索。 我首先在實體A上獲取命令,然后僅寫回實體A。

級聯也在照顧插入A的孩子->它的孩子。

在這里,我對Performace感到非常痛苦,我不知道該怎么辦。

我想您的映射會急切地獲取所有我不會這樣做的孩子。 不查看您的映射就很難說,但是如果您在映射中看到這樣的內容,這就是您的問題:

HasMany(x => x.OrderLines)
            .FetchType.Select();

要么

HasMany(x => x.OrderLines)
            .FetchType.Join();

這意味着,當您加載父對象時,所有這些集合也將被加載,這可能會導致臭名昭著的“ select n + 1”問題。

以下是來自nhibernate文檔的信息:

(3)提取(可選,默認為加入):為此關聯啟用外部結合或順序選擇提取。 這是一個特例; 為了完全渴望獲取(在單個SELECT中)實體及其與其他實體的多對多關系,您不僅要啟用集合本身的聯接獲取,還要啟用嵌套元素上的此屬性的聯接獲取。

如果您無法更改映射,建議您先創建查詢以獲取所有子集合。 這樣,您每個實體只執行1個查詢,而不是通過延遲加載當前執行的1000個nhibernate查詢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM