[英]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.