ページのグラフを 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();
}