超时过期:连接池
问题描述:
这是我们正在收到的错误。我们将应用程序和数据库服务器从32位移至x64。 Framework 2.0 Service Pack 2安装在服务器上。超时过期:连接池
超时已过期。在从池中获取连接之前已超时。发生这种情况的原因可能是因为所有连接池都在使用中,并且达到最大池大小。
下面是数据访问一些代码,从try块内返回一个值:
public string GetSomething()
{ var a = String.Empty;
try
{
// loop through the datareader
return "some data";
}
finally
{
reader.close();
}
return whatever;
}
这里是打开和管理方面,一些代码:
public DBHelper(IDbCommand command)
{
this.command = command;
if (command.Connection.State == ConnectionState.Open)
{
shouldCloseConnection= false;
}
else
{
command.Connection.Open();
shouldCloseConnection= true;
}
}
答
A)确保你的最小池大小足够大。可能类似20或30.
B)小心你正在处理对象。我了解到,例如,当您使用的IDataReader从数据库得到的东西,你应该做的
使用(IDataReader的RDR = ...) {
}
这样,不管什么(包括一个错误)rdr将被丢弃。无论如何,有时池问题是由于没有正确处理数据库连接而造成的。
答
不是一个直接的答案,但请查看活动监视器并查看为应用程序打开的连接。也许在以前的安装中,超时设置被缩短,导致连接在池被填充之前被SQL强制关闭。
+0
在活动监视器中,它表示大多数连接正在休眠。我认为这意味着他们在游泳池中等待使用。 – azamsharp 2009-09-23 14:58:58
答
使用
SqlConnection.ClearAllPools()
,看看这实在是一个连接池的问题尝试。
原来这是一个基本库中的连接泄漏。 – azamsharp 2009-09-24 18:25:13