簡體   English   中英

進行連續ajax調用的正確方法是什么?

[英]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調用后,服務器發回錯誤:

超時時間已到。 從池中獲取連接之前已經過超時時間。 這可能是因為所有池化連接都在使用中,並且達到了最大池大小。

我啟動了調試控制台,這是我觀察到的:

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()獲得記錄后,我將關閉連接,或者還有其他需要做的事情嗎?

編輯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();
}

看起來是服務器端問題,與數據庫的連接過多。 您如何連接到數據庫? 使用后是否要關閉連接? 嘗試在多個連接后關閉連接。

“我從服務器返回錯誤”使我認為這是服務器端資源泄漏。 如果您並行運行兩個瀏覽器選項卡,或並行運行兩個瀏覽器,或兩個具有各自瀏覽器的主機並行運行服務器,會發生什么情況?

您的瀏覽器是否隨着時間推移而上升?

如果您有權訪問服務器端日志,那也很容易理解。

編輯

查看服務器代碼后,出於安全考慮,您可能還希望關閉閱讀器。 如果這引起泄漏,我會感到驚訝,但您永遠不會知道。 我對Java更熟悉,在Java中這可能會導致泄漏,具體取決於所使用的基礎驅動程序。

dr.Close();
con.Close();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM