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

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

超时已过。在从池中获取连接之前超时时间已过。这可能是因为所有池连接都在使用中并且达到了最大池大小。

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

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

2 回答 2

4

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

于 2012-10-08T16:47:31.607 回答
1

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

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

如果您可以访问服务器端日志,那也是一个深入研究的点。

编辑

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

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