2011-07-11 66 views
3

我遇到性能问题,其中一个聚合包拥有大量实体(1000+)。通常它最多只包含50个实体,但有时还会包含更多。阅读大包时NHibernate速度慢

使用NHibernate profiler我发现从数据库中获取这个包的1123条记录的持续时间是18ms,但是它需要NHibernate 1079ms来处理它。这里的问题是所有这些1123条记录都有一两条附加记录。我使用fetch =“subselect”来获取这些数据,并且获取这些额外的记录需要16ms从数据库中获取,并且通过NHibernate处理2527ms。所以这一行动需要3,5秒,这太昂贵了。

我读到,这是因为更新第一级缓存是这里的问题,因为它在加载大量实体​​时性能变慢。但什么是很多? NHibernate Profiler说我有3145个实体加载了31个查询(这在我的情况下是绝对最小值)。这个加载的实体数量对我来说似乎不是很多。

在我们使用NHibernate v3.1.0.4000

+0

试试看这里:http://knol.google.com/k/nhibernate-chapter-16-improving-performance# – danyolgiax

回答

2

我同意,1000实体当前项目并不太多。你确定这个时间没有被用在其中一个构造函数或属性设置器中吗?您可以在加载时间内停止调试器,随时抽取一个随机样本。

此外请确保您使用反射优化器(我认为它默认打开)。

我假设你测量查询本身的时间。如果您衡量整个交易,那么肯定会浪费时间来清理会话。通过将FlushMode设置为Never(仅在会话中未存储任何更改时)或使用StatelessSession来避免冲洗。

疯狂猜测:删除批处理大小设置甚至可能使其更快,因为它不需要将实体分配给相应的集合。