1

我有这个 ajax 调用从客户端执行,使用 jQuery,但有时(我的意思是通常在第一次调用时)它执行非常慢,也许这个图会解释..

在此处输入图像描述

如您所见,最后一次调用在任何事情之前都等待了609 毫秒,虽然接收数据需要210 毫秒,这是可以忍受的,但是为什么要等待609 毫秒呢?

Fiddler 的统计数据是

Request Count:   1
Bytes Sent:      552        (headers:543; body:9)
Bytes Received:  364        (headers:234; body:130)

ACTUAL PERFORMANCE
--------------
ClientConnected:    15:16:42.799
ClientBeginRequest: 15:16:42.799
GotRequestHeaders:  15:16:42.799
ClientDoneRequest:  15:16:42.799
Determine Gateway:  0ms
DNS Lookup:         0ms
TCP/IP Connect:     0ms
HTTPS Handshake:    0ms
ServerConnected:    15:16:42.799
FiddlerBeginRequest:15:16:42.799
ServerGotRequest:   15:16:43.408
ServerBeginResponse:15:16:43.408
GotResponseHeaders: 15:16:43.408
ServerDoneResponse: 15:16:43.408
ClientBeginResponse:15:16:43.408
ClientDoneResponse: 15:16:43.705

jQuery 没什么特别的,只是一个简单的 ajax 调用......

$.ajax({
        url: '/AutoComplete.asmx/GetPriorityAndRemarks',
        type: 'POST',
        timeout: 20000,
        datatype: 'xml',
        cache: false,
        data: 'arg=' + custCode,
        success: function (response) {
            var result = $(response).find("string").text();
            // the values is in form of name, address, mobile, priority and remark, and discount
            var resultAry = result.split(':');
            //alert(resultAry);
            $('#txtCustomerName').val(resultAry[0].trim());
            $('#lblAddress').text(resultAry[1]);
            $('#lblMobileNo').text(resultAry[2]);
            $('#lblPriority').text(resultAry[3]);
            $('#lblRemarks').text(resultAry[4]);
            $('#txtDiscount').val(resultAry[5]);
            $('#txtQty').focus();
            $('#txtQty').select();
            $('#hdnCustCode').val(custCode);
            return false;
        },
        error: function (response) {
             alert('some error occured');
        }
    });

代码实现为

public string GetPriorityAndRemarks(string arg)
{
    try
    {
        SqlCommand cmd = new SqlCommand();

        cmd.CommandText = "sp_NewBooking";
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("@BranchId", Globals.BranchID);
        cmd.Parameters.AddWithValue("@CustCode", arg);
        cmd.Parameters.AddWithValue("@Flag", 31);
        return PrjClass.ExecuteScalar(cmd);
    }
    catch (Exception)
    {
        return "";
    }
}

那么,是什么导致它花费了这么多时间呢?此外,作为一项附加措施,考虑到第一次调用此代码可能会很慢,我在页面加载时使用虚拟参数调用此代码,这样当使用真实数据调用代码时,这不是第一次,也不是关于服务器的任何事情正在设置,缓存或任何已经完成的事情。但是仍然没有运气,无论天气如何,无论我在页面加载时是否使用虚拟数据调用此代码,第一次调用时总是很慢。谁能向我解释为什么会这样?

4

2 回答 2

2

两种(重叠)可能性是:

1)客户端->服务器很慢

2) 服务器 -> 数据库很慢

对于 (1) 如果您的 Web 服务器没有足够的带宽或请求过载,它就不会有效地运行。同样,如果您的客户端(测试)计算机的连接速度非常慢,您的性能将受到阻碍。如果没有更好(更快)具有更多带宽的服务器,就无法解决此问题。但是需要更多的测试来验证这种情况。

对于 (2) 您的存储过程“sp_NewBooking”可能运行不佳。我会考虑为它正在访问的表在 (BranchId, CustCode) 上放置一个非聚集索引。这也可能与 (1) 中解释的问题有关,如果您的数据库服务器因请求而陷入困境,或者您的 Web 服务器和数据库之间的连接不佳,您可能会遇到性能问题。

要测试这些可能性:

让您的客户端计算机 PING 服务器,或访问静态 HTML 或图像文件。检查响应时间,如果它很慢,则说明您有连接问题,或者您的 Web 服务器因请求过多而无法有效处理。

从它所在的网络/域内连接到您的数据库服务器(例如远程桌面到服务器,从同一个 LAN 连接到 sql management studio)。手动运行存储过程并检查响应时间。如果响应速度很慢,那么您的数据库服务器要么陷入了无法有效处理的请求,要么您的底层数据库没有得到很好的优化(在这种情况下,请尝试添加索引)。

于 2012-10-09T17:56:15.140 回答
1

这不是 Firefox 在发送请求之前等待,而是 Firefox 在服务器开始将数据推回套接字之前等待。

请参见此处:Firefox 是“等待响应 - 等待来自服务器的响应”。

因此,问题仅与服务器相关(是的,处理请求的 609 毫秒很糟糕)。分析您的“asmx”页面以查看会发生什么。也许您为自动完成执行了错误的 SQL 查询,或者数据库的索引很差。

于 2012-10-09T10:17:03.983 回答