【问题标题】:NHibernate - Sytem.OutOfMemoryException thrownNHibernate - 抛出 Sytem.OutOfMemoryException
【发布时间】:2011-02-21 11:55:03
【问题描述】:

尝试使用 ASP.NET MVC 和 NHibernate 从 DB 获取 185 条记录时,我收到了 System.OutOfMemoryException。 这是 Repository 类中方法的代码 sn-p:

public IList<RequestForm> GetForFullExport(RequestFormSearchCriteria searchCriteria,     string[] restrictRoles)
{
...

DetachedCriteria criteria = DetachedCriteria.For<RequestForm>()
   .CreateAlias("RequestMember", "RequestMember")
   .CreateAlias("RequestFormStatu", "RequestFormStatu")
   .SetFetchMode("RequestMember", FetchMode.Eager)
   .SetFetchMode("RequestFormStatu", FetchMode.Eager);

DetachedCriteria criteriaLang = DetachedCriteria.For<RequestForm>("af")
    .SetFetchMode("RequestFormsLanguages", FetchMode.Eager)
    .SetFetchMode("RequestFormsLanguages.LanguageMember", FetchMode.Eager);

DetachedCriteria criteriaDoc = DetachedCriteria.For<RequestForm>("af")
    .SetFetchMode("RequestFormsDocuments", FetchMode.Eager)
    .SetFetchMode("RequestFormsDocuments.DocumentMember", FetchMode.Eager);

criteriaLang.Add(Subqueries.PropertyIn("Id", NHibernate.CriteriaTransformer.Clone(criteria).SetProjection(NHibernate.Criterion.Projections.Id())));
criteriaDoc.Add(Subqueries.PropertyIn("Id", NHibernate.CriteriaTransformer.Clone(criteria).SetProjection(NHibernate.Criterion.Projections.Id())));

//Add sort
if (!string.IsNullOrEmpty(searchCriteria.SIdx))
{
    criteria.AddOrder(new Order(searchCriteria.SIdx, searchCriteria.SOrd == "asc"));
}

var multiResult = Session.CreateMultiCriteria()
    .Add(criteria)
    .Add(criteriaLang)
    .Add(criteriaDoc)
    .List();

...
}

这里是代码因 System.OutOfMemory 异常而中断的地方 - 在 Session.CreateMultiCriteria() 处。 我提取了 NHibernate 生成的 SQL 查询并直接在 SQL Server 2005 Management Studio 中执行它,我很快就得到了结果(185 行)。

应用程序实际上正在尝试将 jQuery 网格行导出到 CSV 文件,并且在此过程中调用了上述方法。 仅当我尝试导出所有行时才会发生崩溃。当我导出多行时 - 一切正常。

提前感谢您的帮助。

【问题讨论】:

  • 对不起,我忘了放堆栈跟踪,但是,无论如何,我已经找到了问题所在。我会发布它作为答案。谢谢。

标签: c# asp.net-mvc database nhibernate orm


【解决方案1】:

我遇到了同样的问题。您可以使用 StatelessSession 并设置批量大小。它解决了与批量数据插入数据库相关的问题。 更多参考:http://nhforge.org/blogs/nhibernate/archive/2008/10/30/bulk-data-operations-with-nhibernate-s-stateless-sessions.aspx

【讨论】:

    【解决方案2】:

    代码中有问题的部分是criteriaDoc,它正在搜索包含 MS Word 文件的数据库记录。这些文件很大,这就是我得到这个异常的原因。我不知道这一点,因为我最近接手了这个应用程序。我现在在调查时发现了它。

    基本上,我的问题解决了,因为我不需要用于网格导出的 doc 文件。

    不过,如果有人能回答使用 NHibernate 获取大数据的限制是什么,那就太好了。

    【讨论】:

      【解决方案3】:

      您需要设置MaxResult,这样它就不会将所有行都提取到列表中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多