繁体   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