ASP.NET:如何在这几行代码中提高内存使用率?

时间:2011-11-10 02:05:02

标签: asp.net sql-server memory gridview dataadapter

我有一个只有一个约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。当我决定在整个表中读取时,我还有一个原因是分页不需要另外的数据库访问。我可能错了这个推理。

5 个答案:

答案 0 :(得分:3)

由于您添加了一条完全改变问题动态的评论,我正在发布第二个答案。

为了防止每次都进入数据库,我会将您的数据集存储到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(); 
}

答案 1 :(得分:2)

  

但我认为我需要阅读整个shebang,以便分页可以正常工作。

是的但你可以使用对象数据源而不加载整个数据集来使用分页,请参阅Manually setting a GridView's PageCount when DataSource doesn't return full result set?

  

当我决定阅读整张桌子时,我还有一个原因   该分页不需要另一个数据库访问。我可能是   这个推理错了。

是和否。这真的取决于您的用例。通常,您应该更多地关注每个请求的资源利用率,而不是每个会话。这样您就不会分配未使用的资源(按次付费)

因此,通常我会按照按次付费模式进行操作,只会获取我要显示的数据,除非我们正在处理

昂贵的SQL操作 如果你的结果集很小但是需要很长时间来创建像汇总操作那么我可能想像Anthony Shaw的答案一样缓存它。

全球州 如果它的内容在用户之间共享,则只有第一个用户付费且该游戏对其他人免费。但是你仍然需要一个明智的caching policy

答案 2 :(得分:1)

看一下这篇博客文章。它使用SQL中的ROW_NUMBER()函数创建临时sql分页。您必须传递正确的页码。

http://blogs.x2line.com/al/archive/2005/11/18/1323.aspx

BONUS,该示例已使用10作为pagesize:)

答案 3 :(得分:1)

一种选择是让SQL在您的存储过程中或使用LINQ进行分页。 这篇文章涵盖了: efficient way to implement paging

答案 4 :(得分:1)

这取决于您正在做什么,但如果您的内容不会更新,请考虑缓存它。然后,当对正在显示的内容进行更新时,删除/更新缓存。如果没有任何改变,这将有助于防止与SQL的新连接!