[英]What is the right way of making continuous ajax calls?
我有這樣的代碼可以每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調用后,服務器發回錯誤:
超時時間已到。 從池中獲取連接之前已經過超時時間。 這可能是因為所有池化連接都在使用中,並且達到了最大池大小。
我啟動了調試控制台,這是我觀察到的:
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()
獲得記錄后,我將關閉連接,或者還有其他需要做的事情嗎?
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();
}
看起來是服務器端問題,與數據庫的連接過多。 您如何連接到數據庫? 使用后是否要關閉連接? 嘗試在多個連接后關閉連接。
“我從服務器返回錯誤”使我認為這是服務器端資源泄漏。 如果您並行運行兩個瀏覽器選項卡,或並行運行兩個瀏覽器,或兩個具有各自瀏覽器的主機並行運行服務器,會發生什么情況?
您的瀏覽器是否隨着時間推移而上升?
如果您有權訪問服務器端日志,那也很容易理解。
編輯
查看服務器代碼后,出於安全考慮,您可能還希望關閉閱讀器。 如果這引起泄漏,我會感到驚訝,但您永遠不會知道。 我對Java更熟悉,在Java中這可能會導致泄漏,具體取決於所使用的基礎驅動程序。
dr.Close();
con.Close();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.