Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 连接池保持打开状态存在问题(显式关闭连接)_C#_Sql_.net_Sql Server_Sql Server 2012 - Fatal编程技术网

C# 连接池保持打开状态存在问题(显式关闭连接)

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

我的应用程序出现错误,已达到最大池大小:

超时已过期。从池中获取连接之前经过的超时时间。发生这种情况的原因可能是所有池连接都在使用中,并且已达到最大池大小

我们有一个返回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排序

我还需要做什么来确保这些连接被关闭?我们的团队非常困惑,因为我们所有人都进行了双重和三重检查,检查我们的阅读器在使用后是否关闭和关闭

获取数据读取器的函数:

使用所述功能:


编辑:我将最大池大小增加到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();
    }
}