C# 连接池保持打开状态存在问题(显式关闭连接)
我的应用程序出现错误,已达到最大池大小: 超时已过期。从池中获取连接之前经过的超时时间。发生这种情况的原因可能是所有池连接都在使用中,并且已达到最大池大小 我们有一个返回DataReader的内部函数。在该函数内部,我们使用ExecuteReader方法,该方法的值为CommandBehavior.CloseConnection。读取所需数据后,我们将在此函数返回的DataReader上同时调用.Close和.Dispose 另一方面,我还尝试实现一种不同的方法,在这种方法中,我在连接上使用了using标记,但仍然认为这是在数据库中休眠 我运行下面的查询以获取仍处于睡眠状态的连接。在任何时候,我们都会看到大约40人被列为睡眠者。我抓取了这里使用的SQL脚本,将其追溯到应用程序中使用它们的地方,并对DataReader是否关闭进行了三次检查 选择sp.spid、sp.hostname、sp.program\u name、sp.loginame ,sp.login\u time,sp.status,CASTtext作为VARCHAR1000作为SQLScript 从sys.sysprocesss sp交叉应用sys.dm_exec_sql_text sp.sql\句柄,其中程序\名称=“.Net SqlClient数据提供程序”和 loginame='[LoginNameForSql]'按SQLScript排序 我还需要做什么来确保这些连接被关闭?我们的团队非常困惑,因为我们所有人都进行了双重和三重检查,检查我们的阅读器在使用后是否关闭和关闭 获取数据读取器的函数: 使用所述功能:C# 连接池保持打开状态存在问题(显式关闭连接),c#,sql,.net,sql-server,sql-server-2012,C#,Sql,.net,Sql Server,Sql Server 2012,我的应用程序出现错误,已达到最大池大小: 超时已过期。从池中获取连接之前经过的超时时间。发生这种情况的原因可能是所有池连接都在使用中,并且已达到最大池大小 我们有一个返回DataReader的内部函数。在该函数内部,我们使用ExecuteReader方法,该方法的值为CommandBehavior.CloseConnection。读取所需数据后,我们将在此函数返回的DataReader上同时调用.Close和.Dispose 另一方面,我还尝试实现一种不同的方法,在这种方法中,我在连接上使用了u
编辑:我将最大池大小增加到200,并且从3天前起就没有在我们的应用程序中看到这个错误 确保同时关闭数据库连接对象,而不仅仅是DataReader。打开与数据库的连接将填满您的连接池。我担心的是,您正在关闭连接,但它不会超出范围并很快得到处理 我不认为函数ReturningDataReader增加了那么多的价值。 不要胡闹-尽可能晚地打开连接,尽早地关闭并处理它。 我会在一行中这样做,并将SQLconnection放在一个using中。 我的答案被否决了,因为我没有把读者放在一个应用程序中 这是从文件和我找到的读者。接近就足够了
如果您觉得有必要将读卡器放入using块,那么也要这样做,而不是调用Dispose,您应该将它们包装在using块中。池将始终具有未使用的开放休眠连接,您必须注意池本身报告的可用连接。只有池知道哪些连接分配给/未分配给调用代码。同样在这里:注意连接是在一个using{}中。如果您想将DataReader挂接到连接上,然后在释放连接时关闭连接,那么您可能必须超越DataReader。。。读者怎么知道这是这个连接上的唯一调用?添加了更多代码,谢谢!明显的问题-您确定是这种方法泄漏了连接吗?它可能是由异常上的堆栈跟踪标识的,但这只会告诉您发现池已被删除的方法exhausted@shenn是的,绝对是。很可能40是您的最小或最大连接池大小。。。或者它可能是并发连接的平均数量;会这样做吗?@shenn-这确实是它应该做的。是的,我错过了那部分,对不起。你想发表评论吗?如果你有什么要补充的,那么就这样做。
SqlConnection conn = OpenConnection();
SqlDataReader rdr = null;
// try
// {
SQL = strSQL;
CommandBehavior intBehavior = CommandBehavior.CloseConnection;
using (var cmd = conn.CreateCommand())
{
cmd.CommandText = strSQL;
cmd.CommandTimeout = Timeout;
rdr = cmd.ExecuteReader(intBehavior);
cmd.Parameters.Clear();
}
return rdr;
var rdr = FunctionReturningDataReader();
if (rdr != null)
{
if (rdr.HasRows)
{
while (rdr.Read())
{
}
}
}
rdr.Close();
rdr.Dispose();
private static void ReadOrderData(string connectionString)
{
string queryString =
"SELECT OrderID, CustomerID FROM dbo.Orders;";
using (SqlConnection connection =
new SqlConnection(connectionString))
{
SqlCommand command =
new SqlCommand(queryString, connection);
connection.Open();
SqlDataReader reader = command.ExecuteReader();
// Call Read before accessing data.
while (reader.Read())
{
ReadSingleRow((IDataRecord)reader);
}
// Call Close when done reading.
reader.Close();
}
}