进行连续ajax调用的正确方法是什么?

时间:2012-10-08 16:39:49

标签: javascript jquery asp.net ajax iis

我有一些像这样的代码每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
    });
}

这似乎工作正常,除了连续进行ajax调用16-20小时后,我从服务器收到错误:

  

超时已过期。在获得a之前经过了超时时间   从游泳池连接。这可能是因为所有人都集中了   正在使用连接并达到最大池大小。

我启动了调试控制台,这是我观察到的:

AJAX调用正在被正确触发

enter image description here

在16-20小时之前,有些情况下延迟增加(这是第一次看到Timeout错误的地方)

enter image description here

最后,代码设法遇到了一些瓶颈。每次通话和前端中断的延迟都会增加。在下面的蓝色箭头返回任何数据后没有电话。相反,它会抛出超时错误。

enter image description here

我确信我做的事情根本就是错误的。关于如何解决这个问题的任何想法?

编辑:服务器端代码

我的连接字符串:

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

2 个答案:

答案 0 :(得分:4)

它看起来像服务器端问题,与数据库的连接太多。你是如何连接数据库的?你使用它后关闭连接?尝试在多次连接后关闭连接。

答案 1 :(得分:1)

“我从服务器收到错误”让我觉得这是服务器端资源泄漏。如果您并行运行两个浏览器选项卡,或者并行运行两个浏览器,或者两个主机使用自己的浏览器并行运行服务器,会发生什么?

您的浏览器是否会随着时间的推移而消失?

如果您可以访问服务器端日志,那么这也是潜水点。

修改

在查看服务器代码后,您可能还需要关闭阅读器以确保安全;如果这会导致泄漏,我会感到惊讶,但你永远不会知道。我对Java更熟悉,这会导致泄漏,具体取决于所使用的底层驱动程序。

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