首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Server与.Net客户端-从服务器返回大量数据的最佳实践-性能改进

Server与.Net客户端-从服务器返回大量数据的最佳实践-性能改进
EN

Stack Overflow用户
提问于 2012-03-12 09:40:07
回答 2查看 492关注 0票数 0

我正在攻击企业应用程序中的性能问题。我的一个SQL Proc返回超过2MB的数据(XML纯文本)。对于执行该SP,它仅在DB服务器中占用大约600 ms。但是,在我的UI中需要大约30秒才能得到响应。

SQL server 2008 / .NET 4.0 (IIS承载的windows应用程序)

注意:在以前的性能迭代中--太多的DB调用聚集在一起,因此产生了许多DB调用。但是现在返回的数据是巨大的,并且面临着这个问题。

请帮助确定任何标准或限制,这里提供的最佳做法,以提高性能。

根据以下收到的意见,请在此添加以下内容:

  1. ,但我在执行本地SQLserver查询分析器与现场服务器连接的Sp调用时发现了这一点。2.这不是一个内联网,而是美国/印度之间通过因特网进行的交流。3.利用dottrace工具和源进行了充分的分析。4.不存在绑定这些数据的瓶颈。以前,大约有15个Db调用,其中有in循环(每个调用都带有Kbs的小#),但现在减少到只包含单个调用,但在MB.

中携带大量数据。

你好,Karthikeyan.G

EN

回答 2

Stack Overflow用户

发布于 2012-03-26 12:36:59

当然看起来像UI绑定。2Mb的互联网不太可能需要30秒,但它可能取决于你的连接速度。

考虑到它只需要600毫秒来执行SP,它是有点长,所以最好是缓存它。无论如何,2MB并不需要缓存太多(只要它不是每个用户)。

获取2MB的数据,缓存它,分割它。例如获取前100条记录,然后将这些行绑定到UI控件并实现分页。

但是,如果没有代码,我就无法看到您要绑定到哪种类型的控件的数据的类型和深度。

票数 0
EN

Stack Overflow用户

发布于 2012-04-27 11:58:36

您可以使用异步编程:

代码语言:javascript
复制
    Dim connectionString As String = "server=.\SQLEXPRESS; database=master; Integrated Security=true; Asynchronous Processing=true"

  Private Sub btnDisplayCustomersCallback_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDisplayCustomersCallBack.Click
        Dim sqlConnection As New SqlConnection(connectionString)
        Dim sqlCommand As SqlCommand = sqlConnection.CreateCommand()
        Dim asyncResult As IAsyncResult
        'Example of Asynchronous Callback Model

        sqlCommand.CommandText = "SELECT * FROM [customer]"
        sqlCommand.CommandType = CommandType.Text
        sqlConnection.Open()
        btnDisplayCustomersCallBack.Enabled = False


        Dim callback As AsyncCallback = New AsyncCallback(AddressOf DisplayCustomers)
        asyncResult = sqlCommand.BeginExecuteReader(callback, sqlCommand, CommandBehavior.CloseConnection)
    End Sub

  Private Sub DisplayCustomers(ByVal result As IAsyncResult)
        Dim dr As SqlDataReader
        Dim command As SqlCommand
        Dim del As DelFillGrid
        Try
            command = CType(result.AsyncState, SqlCommand)
            dr = command.EndExecuteReader(result)
            del = New DelFillGrid(AddressOf FillGrid)
            Threading.Thread.Sleep(5000)
            Me.Invoke(del, dr)

        Finally
            If (Not dr.IsClosed) Then
                dr.Close()
            End If
        End Try
    End Sub

Private Sub FillGrid(ByVal dr As SqlDataReader)
        Try
            Dim dt As New DataTable()
            dt.Load(dr)
            Me.DataGridView1.DataSource = dt
        Catch ex As Exception
            ' Because you're guaranteed this procedure 
            ' is running from within the form's thread, 
            ' it can directly interact with members of the form. 
        Finally
            btnDisplayCustomersCallBack.Enabled = True

            If dr IsNot Nothing Then
                dr.Close()
            End If

        End Try
    End Sub

在这种情况下,应用程序将在异步方法中生成一个ExecuteReader请求,当得到结果时,网格将被填充。在此之前,应用程序将进行进一步处理。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9664659

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档