【问题标题】:How to deal with a long-running database query in ASP.NET如何在 ASP.NET 中处理长时间运行的数据库查询
【发布时间】:2013-10-05 19:19:03
【问题描述】:

我是一名 Windows 桌面应用程序程序员,并且是 ASP.NET 的新手。

当我在 Page_Load(object sender, EventArgs e) 处执行长时间运行的数据库查询时,用户必须等到查询完成(查询需要很长时间)。

我可以使用 SqlDataReader 在另一个线程中逐行从表中提取数据并将数据逐行发送给用户吗?这样,用户就不需要等到所有的行都从数据库中拉出来了。

如果我使用 WPF 框架编写 Windows 桌面应用程序,我可以在另一个线程中逐行从数据库中提取数据,并使用 BeginInvoke 模式将数据逐行发送到 UI。

但是,当我使用 ASP.NET 编写 Web 应用程序时,我不知道最好的方法是什么。我可以在另一个线程中逐行拉取数据并将拉取的数据放到Session中,然后我定期发送一个XMLHttpRequest从Session中获取拉取的数据吗?

我想知道是否存在长时间运行的数据库查询,在 ASP.NET 中处理它的最佳做法是什么?

【问题讨论】:

  • 最佳实践 - 不要长时间运行查询。重新思考页面与 SP 交互的方式。例如。如果它产生大数据集,则在一次只向用户显示一小部分数据时实现分页机制。
  • 如果结果数据不是太动态(不是根据用户而变化),你可以看看ASP.NET output caching
  • 不应在 page_load 上调用长时间运行的查询。如果该过程需要时间并且您需要应用程序响应,您必须重新访问您的查询并尝试优化它或进行页面加载后异步 Ajax 调用。

标签: asp.net database web-applications


【解决方案1】:

我可以使用 SqlDataReader 从表中逐行提取数据吗? 另一个线程并将数据逐行发送给用户?这样, 用户不需要等到所有行都从 数据库。

问题是 ASP.NET 应用程序的生命周期与 Windows 窗体应用程序不同。呈现页面并向用户发送响应后,您将无法再使用数据。你可以做的是使用javascript。您可以使用 UpdatePanel、ASP.NET 的 AJAX 实现,或使用 XMLHttpRequests。 (JQuery,我相信您已经听说过,它使用 $.ajax 简化了这些请求)。您可以使用加载 .gif 来代替您的数据,并在页面准备好后让 javascript 获取数据。

逐行加载可能更棘手。下面的代码将启动一个数据库调用,并在查询完成之前返回渲染的页面:

    protected void Page_Load( object sender, EventArgs e)
    {
        string query = "SELECT * FROM db.Tablename;"
        ThreadPool.QueueUserWorkItem(new WaitCallback (BuildDataSet), query);

    }

    private void BuildDataSet(object query)
    {
        Queue Q = new Queue();

        //Connection String, etc.

        while rdr.Read()
        {
            Q.Enqueue(rdr["Column"];
        }
    }

您需要第二个页面来处理获取行的 XMLHttpRequests。困难在于持久化这些数据、在请求之间识别它,以及可能的内存管理。

我能想到的最简单的方法是在 page_load 上执行SELECT TOP (50),然后在获取完整数据后将其 ajax。

【讨论】:

    猜你喜欢
    • 2019-09-27
    • 1970-01-01
    • 2019-03-07
    • 1970-01-01
    • 2020-12-10
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 2014-03-14
    相关资源
    最近更新 更多