asp.net – 抛出类型“System.OutOfMemoryException”的异常 为什么?
|
我有一个动态查询返回约59万条记录。它第一次运行成功,但如果我再次运行它,我会继续收到一个System.OutOfMemoryException。可能发生什么原因? 错误发生在这里: public static DataSet GetDataSet(string databaseName,string
storedProcedureName,params object[] parameters)
{
//Creates blank dataset
DataSet ds = null;
try
{
//Creates database
Database db = DatabaseFactory.CreateDatabase(databaseName);
//Creates command to execute
DbCommand dbCommand = db.GetStoredProcCommand(storedProcedureName);
dbCommand.CommandTimeout = COMMAND_TIMEOUT;
//Returns the list of SQL parameters associated with that stored proecdure
db.DiscoverParameters(dbCommand);
int i = 1;
//Loop through the list of parameters and set the values
foreach (object parameter in parameters)
{
dbCommand.Parameters[i++].Value = parameter;
}
//Retrieve dataset and set to ds
ds = db.ExecuteDataSet(dbCommand);
}
//Check for exceptions
catch (SqlException sqle)
{
throw sqle;
}
catch (Exception e)
{
throw e; // Error is thrown here.
}
//Returns dataset
return ds;
}
这是按钮上运行的代码点击: protected void btnSearchSBIDatabase_Click(object sender,EventArgs e)
{
LicenseSearch ls = new LicenseSearch();
DataTable dtSearchResults = new DataTable();
dtSearchResults = ls.Search();
Session["dtSearchResults"] = dtSearchResults;
Response.Redirect("~/FCCSearch/SearchResults.aspx");
}
else
lblResults.Visible = true;
}
解决方法
无论其他人说什么,错误与忘记处理您的DBCommand或DBConnection毫无关系,并且您不会通过处理其中任何一个来解决您的错误。 该错误与您的数据集有关,该数据集包含近60万行数据。显然,您的数据集占用机器可用内存的50%以上。显然,在第一个垃圾回收之前返回另一个相同大小的数据集时,内存不足。就那么简单。 您可以通过以下几种方式解决此问题: 考虑返回较少的记录。我个人无法想象,返回600K记录对用户有用的时间。为了最小化返回的记录,请尝试: >将您的查询限制为前1000条记录。如果从查询返回超过1000个结果,请通知用户缩小搜索结果范围。 >如果您只需要遍历数据,而不需要随机访问,请尝试返回一个datareader。数据采集器一次只能将一个记录载入内存。 如果没有这些选项,则需要强制.NET释放数据集使用的内存,然后使用以下方法之一调用方法: >删除对您的旧数据集的所有引用。对数据集进行补救的任何东西都将阻止内存回收。 我不相信你将需要调用GC.Collect()强制一个循环。调用GC.Collect()通常不是一个坏主意,因为足够的内存压力会导致.NET自己调用垃圾回收器。 注意:在数据集上调用Dispose不会释放任何内存,也不会调用垃圾收集器,也不会删除对数据集的引用。 Dispose用于清理非托管资源,但DataSet没有任何非托管资源。它只实现IDispoable,因为它固有的来自MarshalByValueComponent,所以数据集上的Dispose方法几乎没有用。 (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net中使用repeater和PageDataSource搭配实现分页代码
- asp.net-mvc-routing – @ Url.Action获取?附加长度= 2
- asp.net-mvc-3 – 修改StringLength验证的默认ErrorMessage
- ASP.Net:如果我有Session ID,可以获取Session对象吗?
- asp.net – 什么是.MSPX文件扩展名?
- asp.net-mvc – 更改MVC4上的基本视图类型
- asp.net-web-api – Structure Map无参数构造函数错误
- asp.net-mvc – 如何绘制密码字段就像我们绘制Ember.TextFi
- asp.net-mvc – 使用ASP.NET MVC的IIS应用程序请求路由(ARR
- asp.net – 在使用预编译的Razor视图和VirtualPathProvider
