ASP.NET:如何在这几行代码中提高内存使用率?
Posted
技术标签:
【中文标题】ASP.NET:如何在这几行代码中提高内存使用率?【英文标题】:ASP.NET: How to improve memory usage in these few lines of code? 【发布时间】:2011-12-25 19:52:11 【问题描述】:我有一个数据库,其中只有一个包含大约 7,000 条记录的表。 我有一个 GridView 可以一次显示 10 行这些记录(我使用 GridView 提供的自动分页功能)。
这是我在表格中阅读并显示记录的方式。显然,我读了整个表格,但只显示了 10 行,这似乎很浪费内存。但我认为我需要阅读整个 shebang 以便分页可以工作。我错了吗?如果是这样,我该如何改进此代码:
private void ShowGridViewData()
// I LEAVE ONLY RELEVANT CODE TO AVOID CLUTTER
string queryString = (string)Session["queryString"];
String connectionString = ConfigurationManager.ConnectionStrings["productsSQLConnectionString"].ConnectionString;
DataSet ds = new DataSet();
SqlConnection connection = new SqlConnection(connectionString);
SqlDataAdapter adapter = new SqlDataAdapter(queryString, connection);
// Fill the DataSet.
adapter.Fill(ds);
GridView1.DataSource = ds;
GridView1.DataBind();
adapter.Dispose();
connection.Close();
附加信息:我无法更改代码以使用 LINQ。当我决定读取整个表时,我还有一个原因是分页不需要另一个数据库访问。我可能对这个推理有误。
【问题讨论】:
附加信息:我无法更改代码以使用 LINQ。当我决定读取整个表时,我还有一个原因是分页不需要另一个数据库访问。我可能对这个推理有误。 编辑原始问题比添加评论要好得多 【参考方案1】:由于您添加的评论完全改变了问题的动态,因此我发布了第二个答案。
为了避免每次都访问数据库,我会将您的数据集存储到 Session 中并每次都从那里访问它。我已经从上面修改了你的代码以包含这个,我唯一没有看到的是你在哪里实现对 GridView 的分页。我认为这包含在“为避免混乱而删除”的代码中
private void ShowGridViewData()
// I LEAVE ONLY RELEVANT CODE TO AVOID CLUTTER
DataSet ds = new DataSet();
if (Session["ProductsDataSet") == null)
string queryString = (string)Session["queryString"];
String connectionString = ConfigurationManager.ConnectionStrings["productsSQLConnectionString"].ConnectionString;
SqlConnection connection = new SqlConnection(connectionString);
SqlDataAdapter adapter = new SqlDataAdapter(queryString, connection);
// Fill the DataSet.
adapter.Fill(ds);
Session["ProductsDataSet"] = ds;
else
ds = (DataSet)Session["ProductsDataSet"]
GridView1.DataSource = ds;
GridView1.DataBind();
adapter.Dispose();
connection.Close();
【讨论】:
【参考方案2】:但我认为我需要阅读整个 shebang 以便分页可以工作。
是的,但您可以使用分页,而无需使用对象数据源加载整个数据集,请参阅Manually setting a GridView's PageCount when DataSource doesn't return full result set?
当我决定阅读整张表格时,还有一个原因是 该分页不需要其他数据库访问。我可能是 这个推理错了。
是和否。这真的取决于你的用例。通常,您应该更多地担心每个请求的资源利用率,而不是每个会话。这样您就不会分配未使用的资源(按次付费)
所以我通常遵循按次付费模式,只获取我要展示的数据,除非我们正在处理
昂贵的 SQL 操作 如果您的结果集很小但需要很长时间才能像汇总操作一样创建,我可能想像 Anthony Shaw 的回答一样缓存它。
全局状态 如果它在用户之间共享,那么只有第一个用户付费,其他人免费玩。但是你还是需要一个理智的caching policy)
【讨论】:
【参考方案3】:看看这个博客条目。它使用 SQL 中的 ROW_NUMBER() 函数创建临时 sql 分页。您必须传递正确的页码。
http://blogs.x2line.com/al/archive/2005/11/18/1323.aspx
BONUS,该示例已经使用 10 作为页面大小:)
【讨论】:
【参考方案4】:一种选择是让 SQL 在存储过程中或使用 LINQ 进行分页。 这篇文章涵盖了: efficient way to implement paging
【讨论】:
【参考方案5】:这取决于您在做什么,但如果您的内容更新不多,请考虑缓存它。然后,当对您显示的任何内容进行更新时,删除/更新缓存。如果没有任何变化,这将有助于防止与 SQL 建立新连接!
【讨论】:
以上是关于ASP.NET:如何在这几行代码中提高内存使用率?的主要内容,如果未能解决你的问题,请参考以下文章
提高 ASP.NET Web 应用性能的 24 种方法和技巧
提高 ASP.NET Web 应用性能的 24 种方法和技巧(转载)
如何在 ASP.NET Core 中使用 NLog 的高级特性