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 Web应用性能的技巧

如何在 ASP.NET Core 中使用 NLog 的高级特性

Asp.Net Core-几行代码解决Razor中的嵌套if语句

提高 ASP.NET Web 应用性能的 24 种方法和技巧