C# NHibernate-引发Sytem.OutOfMemoryException
当我尝试使用ASP.NET MVC和NHibernate从数据库中获取185条记录时,我遇到System.OutOfMemoryException。 以下是Repository类中方法的代码片段:C# NHibernate-引发Sytem.OutOfMemoryException,c#,asp.net-mvc,database,nhibernate,orm,C#,Asp.net Mvc,Database,Nhibernate,Orm,当我尝试使用ASP.NET MVC和NHibernate从数据库中获取185条记录时,我遇到System.OutOfMemoryException。 以下是Repository类中方法的代码片段: public IList<RequestForm> GetForFullExport(RequestFormSearchCriteria searchCriteria, string[] restrictRoles) { ... DetachedCriteria criteria
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();
...
}
public IList GetForFullExport(RequestFormSearchCriteria searchCriteria,string[]restrictRoles)
{
...
DetachedCriteria=DetachedCriteria.For()
.CreateAlias(“请求成员”、“请求成员”)
.CreateAlias(“RequestFormStatu”、“RequestFormStatu”)
.SetFetchMode(“RequestMember”,FetchMode.Eager)
.SetFetchMode(“RequestFormStatu”,FetchMode.Eager);
DetachedCriterialang=DetachedCriteria.For(“af”)
.SetFetchMode(“RequestFormsLanguages”,FetchMode.Eager)
.SetFetchMode(“RequestFormsLanguages.LanguageMember”,FetchMode.Eager);
DetachedCriteriaDoc=DetachedCriteria.For(“af”)
.SetFetchMode(“RequestFormsDocuments”,FetchMode.Eager)
.SetFetchMode(“RequestFormsDocuments.DocumentMember”,FetchMode.Eager);
Add(subquerys.PropertyIn(“Id”,NHibernate.CriteriaTransformer.Clone(criteria.SetProjection)(NHibernate.criteria.Projections.Id());
Add(subquerys.PropertyIn(“Id”,NHibernate.CriteriaTransformer.Clone(criteria.SetProjection)(NHibernate.criteria.Projections.Id());
//添加排序
如果(!string.IsNullOrEmpty(searchCriteria.SIdx))
{
criteria.AddOrder(新订单(searchCriteria.SIdx,searchCriteria.SOrd==“asc”);
}
var multiResult=Session.CreateMultiCriteria()
.Add(标准)
.Add(标准语言)
.Add(标准文档)
.List();
...
}
下面是代码在Session.CreateMultiCriteria()处与System.OutOfMemory异常中断的地方。
我提取了NHibernate生成的SQL查询,并直接在SQLServer2005ManagementStudio中执行,结果非常快(185行)
应用程序实际上正在尝试将jQuery网格行导出到CSV文件,并且在这个过程中调用了上述方法。
只有当我尝试导出所有行时,才会发生崩溃。当我导出几行时,一切正常
提前感谢您的帮助。代码中有问题的部分是
criteriaDoc
,它正在搜索包含MS Word文件的DB记录。这些文件的大小很大,这就是我得到这个异常的原因。我没有意识到这一点,因为我最近接管了这个应用程序。我现在在调查的时候发现了
基本上,我的问题解决了,因为网格导出不需要文档文件
不过,如果有人能回答使用NHibernate获取大数据的限制,那就太好了。您需要设置MaxResult,这样它就不会将所有行都提取到列表中。我也面临同样的问题。您可以使用无状态会话并设置批大小。它解决了与批量数据插入数据库相关的问题。
更多参考信息:对不起,我忘记放置堆栈跟踪,但无论如何,我已经找到了问题所在。我会把它作为答案贴出来。谢谢