【问题标题】:jQuery ajax call, server respoding very late?jQuery ajax 调用,服务器响应很晚?
【发布时间】:2012-10-10 01:56:15
【问题描述】:

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

如你所见,最后一次调用在等待609ms之前,虽然接收数据花了210ms,这是可以忍受的,但是为什么要等待 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 "";
    }
}

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

【问题讨论】:

标签: jquery ajax performance firebug fiddler


【解决方案1】:

两种(重叠的)可能性是:

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

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

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

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

测试这些可能性:

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

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

【讨论】:

    【解决方案2】:

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

    参见here:Firefox 正在“等待响应 - 等待来自服务器的响应”。

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

    【讨论】:

    • @dystory:我如何配置我的asmx 页面?通过单击firebug's Console 窗口中的配置文件按钮?
    • 否:firefox 不会帮助您分析服务器。但恐怕这是一个非常不同的问题,我无法帮助你解决 ASP.net 问题(我建议你在谷歌上搜索“asp.net profiling”或使用相关标签提出不同的问题,以便具有 asmx 能力的人可以帮助你)。
    猜你喜欢
    • 2010-12-26
    • 1970-01-01
    • 2015-04-17
    • 2011-11-16
    • 2012-03-24
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 2023-03-08
    相关资源
    最近更新 更多