8

ページのグラフを 30 秒ごとにリアルタイムで更新する次のようなコードがあります。

var counter = 30;

$(function() {
    prepare();
    update();
});

function update() {
    $("#timer").html("Refreshing in " + counter + " seconds...");
    counter--;

    if (counter == 0) {
        counter = 30;
        prepare();
    }

    setTimeout(update, 1000);
}

function prepare() {
    $.ajax({
        type: "POST",
        url: "Service.asmx/GetPlotData",
        contentType: "application/json; charset=utf-8",
        success: OnSuccess, // this function plots the new data
        error: OnError
    });
}

これは、16 ~ 20 時間連続して ajax 呼び出しを行った後を除いて、正常に機能しているように見えますが、サーバーからエラーが返されます。

タイムアウトになりました。プールから接続を取得する前に、タイムアウト期間が経過しました。これは、プールされたすべての接続が使用中で、最大プール サイズに達したために発生した可能性があります。

デバッグ コンソールを起動したところ、次のような結果が得られました。

AJAX 呼び出しが正しく起動される

ここに画像の説明を入力

16 ~ 20 時間の前に、レイテンシが増加するインスタンスがいくつかあります (ここでTimeout初めてエラーが表示されます) 。

ここに画像の説明を入力

最後に、コードは何とかボトルネックにぶつかりました。呼び出しごとにレイテンシが増加し、フロントエンドが壊れます。下の青い矢印の後の呼び出しはデータを返しません。代わりに、タイムアウト エラーがスローされます。

ここに画像の説明を入力

私は根本的に間違ったことをしていると確信しています。この問題に対処する方法についてのアイデアはありますか?

編集: サーバー側のコード

私の接続文字列:

Data Source={0};Initial Catalog={1};Integrated Security=True;MultipleActiveResultSets=true

レコードをプルするコード:

try
{
    string ConString = Constants.connString;
    con = new SqlConnection(ConString);

    cmd = new SqlCommand(sql, con);
    con.Open();
    dr = cmd.ExecuteReader();

    while (dr.Read())
    {
        // Add the records into an object
    }

}
catch (Exception x)
{
     // Send back some error text.
     // This is what is giving out the Timeout error
}
finally
{
    con.Close();
}

何か不足していない限り、を使用してレコードを取得した後に接続を閉じていますか、con.Close()それとも他に何かする必要がありますか?

EDIT 2: 上記のコードを次のように変更します。これは正しいです?

try
{
    string ConString = Constants.connString;

    using (con = new SqlConnection(ConString))
    {
        cmd = new SqlCommand(sql, con);
        con.Open();
        dr = cmd.ExecuteReader();

        while (dr.Read())
        {
            // Add rows to object
        }
    }

}
catch (Exception x)
{
    // Handle error
}
finally
{
    con.Close();
}
4

2 に答える 2

4

データベースへの接続が多すぎるというサーバー側の問題のようです。どのようにDBに接続していますか?使用後に接続を閉じていますか?数回接続したら、接続を閉じてみてください。

于 2012-10-08T16:47:31.607 に答える
1

「サーバーからエラーが返されます」と、これはサーバー側のリソースリークだと思います。2つのブラウザータブを並行して実行するか、2つのブラウザーを並行して実行するか、または独自のブラウザーを備えた2つのホストを並行してサーバーに接続するとどうなりますか?

お使いのブラウザは時間の経過とともに上昇しますか?

サーバー側のログにアクセスできる場合は、それも重要なポイントになります。

編集

サーバーコードを見た後、安全のためにリーダーも閉じたいと思うかもしれません。これがリークを引き起こしたとしたら驚きますが、あなたは決して知りません。私はJavaに精通しており、使用されている基になるドライバーによってはリークが発生する可能性があります。

dr.Close();
con.Close();
于 2012-10-08T16:57:05.240 に答える