1

私はこのajax呼び出しをクライアント側からjQueryを使用して実行していますが、時々(つまり、通常は最初の呼び出しで)実行が非常に遅くなります。おそらくこの図で説明できます。

ここに画像の説明を入力してください

ご覧のとおり、最後のコールは何よりも609ミリ秒待機していますが、データの受信には210ミリ秒かかりましたが、それは耐えられますが、なぜ609ミリ秒待機するのでしょか。

フィドラーの統計は

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

2つの(重複する)可能性は次のとおりです。

1)クライアント->サーバーが遅い

2)サーバー->データベースが遅い

(1)Webサーバーに十分な帯域幅がないか、要求で過負荷になっている場合、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は「応答を待機しています-サーバーからの応答を待機しています」。

したがって、問題はサーバーにのみ関連しています(そして、はい、要求を処理するための609msはひどいです)。「asmx」ページのプロファイルを作成して、何が起こるかを確認します。オートコンプリートに対して不適切なSQLクエリを実行しているか、データベースのインデックスが適切に作成されていない可能性があります。

于 2012-10-09T10:17:03.983 に答える