NHibernate - 检索大量数据变得指数慢

时间:2010-12-22 17:20:45

标签: nhibernate

当我在NHibernate中检索大量数据时(例如在生成报告时),我遇到了一个问题,页面变得越来越慢,它需要检索的数据越多。我找到了以下文章:

http://nhforge.org/blogs/nhibernate/archive/2008/10/30/bulk-data-operations-with-nhibernate-s-stateless-sessions.aspx

它解释了如何在NHibernate中进行批量数据操作的速度很慢,因为第一级缓存增长得太大以及您应该如何使用IStatelessSession。我遇到的麻烦是我不希望将我的应用程序绑定到NHibernate,所以我在ISession周围添加了一个包装器。然后我使用Linq作为我的查询机制,但IStatelessSession不支持Linq(它可能在NHibernate 3中做,但Linq提供程序现在不稳定)。

然后我读到你可以在经过这么多次迭代后清除第一级缓存。现在的问题是你不能使用延迟加载。 linq提供程序不允许您覆盖定义的映射(或急切地获取其他数据),因此每当我在清除会话后抓取延迟加载的数据时,就会抛出异常。

我现在完全迷失了。我喜欢使用linq生成报告的简易性,但NHibernate中内置的linq提供程序的限制似乎阻碍了我。

如果有人能给我一个替代方法,我真的很感激。感谢

1 个答案:

答案 0 :(得分:4)

我很确定ICriteria或Linq方法不支持这一点;但是,您可以考虑使用hql命名查询。在映射上设置"read-only"属性将阻止在会话中跟踪实体。可以找到更多信息here

由于这与您的使用有关,我不担心无法在linq-to-nhibernate的上下文中执行所有操作。虽然它对于处理大多数场景非常有用,但报告等专门用法通常最好留给hql甚至本机sql等方法。不要害怕在您的存储库中使用一些.GetEntitySummaryReport()方法,这不是世界末日。

<强>更新

如果向您的存储库添加方法感觉错误,我建议您查看使用Enhanced Query Object,它提供了一种很好的方法来以提供者agnositc方式封装专用查询