【发布时间】:2010-12-23 05:48:40
【问题描述】:
当我在 NHibernate 中检索大量数据时(例如在生成报告时),我遇到了一个问题,该页面需要检索的数据越多,速度就越慢。我找到了以下文章:
它解释了在 NHibernate 中进行批量数据操作是如何缓慢的,因为第一级缓存变得太大,以及应该如何使用 IStatelessSession。我遇到的麻烦是我不想将我的应用程序绑定到 NHibernate,所以我在 ISession 周围添加了一个包装器。然后我使用 Linq 作为我的查询机制,但 IStatelessSession 不支持 Linq(它可能在 NHibernate 3 中支持,但目前 Linq 提供程序并不稳定)。
然后我读到,您可以在多次迭代后进行清除以清除一级缓存。现在的问题是你不能使用延迟加载。 linq 提供程序不允许您覆盖定义的映射(或急切地获取附加数据),因此每当我在清除会话后抓取延迟加载的数据时,都会引发异常。
我完全不知道现在该做什么。我喜欢使用 linq 轻松生成报告,但 NHibernate 中内置 linq 提供程序的限制似乎阻碍了我。
如果有人能告诉我另一种方法,我将不胜感激。谢谢
【问题讨论】:
-
检索大量数据是什么意思?您是在谈论带有一些关系数据的 10 行还是 1000 行或行?如果您要检索 > 100 行,我会说您做错了。你能解释一下你的场景(不是你的问题)吗,因为它可能只是你的场景错了。
-
嗨,Phil,我们说的可能是 1000 行。这是一次性报告,所以我不介意这需要几分钟,但目前如果我记录 100 条记录需要 5 分钟,20 条记录需要 15 分钟,30 条记录需要一个多小时。你会注意到我试图达到的指数级增长。
-
所以问题实际上不是检索记录并显示它们,而是处理记录?在数据库中做了多少,在代码中做了多少?您能否提前预先计算数据,以便在生成报告时不会进行太多处理,主要只是检索。此外,如果您有 joins/where 条件,您是否对查询进行了概要分析以查看它在哪里运行缓慢。
-
在不了解您的类、映射和 LINQ 查询的情况下很难回答这个问题。您确定您没有遇到 SELECT N+1 问题,因为这通常会随着记录数量的增加而导致指数级减速。适当放置的连接或映射修改通常可以解决问题。因此,我们将不胜感激。
-
大家干杯。有关我如何解决延迟加载和 select n + 1 问题的更多信息,请参阅我对标记答案的回复。
标签: nhibernate