0

私のMVCアプリケーションでは、10秒ごとに繰り返しajax呼び出しを使用しています。しばらくすると、DBサーバーがアプリケーションサーバーから切断され、アプリケーションが実行されているブラウザで大量のメモリリークが発生することがあります。

私のコードは、

10秒ごとに繰り返しajax呼び出しを行うためにjquery.timer.jsを使用しています

function class1() {
}

class1.prototype. funtion1 = function () {
    $.ajax({
        type: "POST",
        url: "/TestContoller/ActionOne",
        success: function (result) {
            $('#DivActionOne').html(result);
        },
        traditional: true,
        error: function (req, status, error) {
        }
    });
}

//Likewise for funtion2, funtion3, funtion4, funtion5

var count = 0;
var timer = $.timer(function () {
    $('#counter').html(++count);
    var class1 = new class1();
    var funtionOne= class1.funtion1;
    var funtionTwo= class1.funtion2;
    var funtionThree= class1.funtion3;
    var funtionFour= class1.funtion4;
    var funtionFive= class1.funtion5;
    var currentSec = count;
    if ((currentSec % 10) == 0) {
        funtionOne ();
        funtionTwo ();
        funtionThree ();
        funtionFour ();
        funtionFive ();
    }
});
timer.set({ time: 1000, autostart: true });

接続が失われたとき、トレースログを確認し、次のエラーメッセージを見つけました。

メッセージ:System.ServiceModel.CommunicationException:基になる接続が閉じられました:存続することが期待されていた接続がサーバーによって閉じられました。---> System.Net.WebException:基になる接続が閉じられました:存続することが期待されていた接続がサーバーによって閉じられました。---> System.IO.IOException:トランスポート接続からデータを読み取れません:既存の接続がリモートホストによって強制的に閉じられました。---> System.Net.Sockets.SocketException:既存の接続がSystem.Net.Sockets.NetworkStream.Read(Byte []バッファー、Int32オフセット、Int32サイズ)のリモートホストによって強制的に閉じられました---内部の終わり例外スタックトレース---System.Net.Sockets.NetworkStream.Read(Byte []バッファー、Int32オフセット、Int32サイズ)でSystem.Net.PooledStream.Read(Byte []バッファー、Int32オフセット、

これを整理するのを手伝ってください。

4

1 に答える 1

1

タイマーを使用していて、前のajaxで次のajaxリクエストを呼び出さないため、コールバック関数が呼び出されます。WebサーバーをWebガーデンのように扱うように設定しない限り(同時リクエストを許可)、次のサーバーに進む前に、各サーバーが終了するまで待つ必要があります。

ajax呼び出しを関数に入れてから、successコールバックで関数を呼び出して、終了時に再度実行されるようにします。

もちろん、無限にループしないように、終了したかどうかを判断するある種の変数を設定する必要があります。

それを超えるものは、サーバー側の最適化が必要になります。

私はプロトタイプを使ったことがないので、もちろんプロトタイプがなくても、このようなものは機能するはずですが、ここではプロトタイプがありません:

  thecount = 0;       
    function class1() { 
        $.ajax({
            type: "POST",
            url: "/TestContoller/ActionOne",
            success: function (result) {
                $('#DivActionOne').html(result);                    
                thecount++1;                    
                if (thecount < 5) { class1(); }                    
            },
            traditional: true,
            error: function (req, status, error) {
            }
        });            
    }
于 2012-06-27T05:36:54.727 に答える