我遇到了性能问题,其中聚合有一个包含大量实体(1000 多个)的包。通常它最多只包含 50 个实体,但有时会更多。
使用 NHibernate 分析器,我看到从数据库中获取这个包的 1123 条记录的持续时间是 18 毫秒,但 NHibernate 需要 1079 毫秒来处理它。这里的问题是所有这 1123 条记录都有一两个额外的记录。我使用 fetch="subselect"获取这些数据,获取这些附加记录需要 16 毫秒从数据库中获取,NHibernate 处理需要 2527 毫秒。所以仅这个 Action 就需要 3.5 秒,这太昂贵了。
我读到这是因为更新一级缓存是这里的问题,因为它在加载大量实体时性能变慢。但什么是很多? NHibernate Profiler 说我有 1145 个实体由 31 个查询加载(在我的例子中这是绝对最小值)。这个加载的实体数量对我来说似乎并不多。
在当前项目中我们使用的是 NHibernate v3.1.0.4000
最佳答案
我同意,1000 个实体并不算多。您确定其中一个构造函数或属性 setter 中没有使用时间吗?您可以在加载期间停止调试器,以在它花费时间的地方进行随机采样。
还要确保您使用了反射优化器(我认为它是默认打开的)。
我假设您测量查询本身的时间。如果您衡量整个交易,它肯定会花时间刷新 session 。通过将 FlushMode
设置为 Never
(仅当要存储的 session 中没有任何更改时)或使用 StatelessSession
来避免刷新.
一个疯狂的猜测:删除批量大小设置甚至可能使其更快,因为它不需要将实体分配给相应的集合。
关于performance - 读取大包时 NHibernate 变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6647774/