我有一些像这样的代码每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之前经过了超时时间 从游泳池连接。这可能是因为所有人都集中了 正在使用连接并达到最大池大小。
我启动了调试控制台,这是我观察到的:
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();
}
答案 0 :(得分:4)
它看起来像服务器端问题,与数据库的连接太多。你是如何连接数据库的?你使用它后关闭连接?尝试在多次连接后关闭连接。
答案 1 :(得分:1)
“我从服务器收到错误”让我觉得这是服务器端资源泄漏。如果您并行运行两个浏览器选项卡,或者并行运行两个浏览器,或者两个主机使用自己的浏览器并行运行服务器,会发生什么?
您的浏览器是否会随着时间的推移而消失?
如果您可以访问服务器端日志,那么这也是潜水点。
修改强>
在查看服务器代码后,您可能还需要关闭阅读器以确保安全;如果这会导致泄漏,我会感到惊讶,但你永远不会知道。我对Java更熟悉,这会导致泄漏,具体取决于所使用的底层驱动程序。
dr.Close();
con.Close();