【问题标题】:How to Solve Max Connection Pool Error如何解决最大连接池错误
【发布时间】:2013-03-28 17:07:07
【问题描述】:

我在 asp.net 3.5 中有一个应用程序,数据库是 Sql server 2005。

"Timeout expired.  The timeout period elapsed prior to obtaining a connection from the pool.  This may have occurred because all pooled connections were in use and max pool size was reached."

有时出现这个错误如何解决这个错误..

我尝试SqlConnection.ClearAllPools();,但这也不起作用。

SqlCommand cmdToExecute = new SqlCommand();
            cmdToExecute.CommandText = "dbo.[sp_user_listing]";
            cmdToExecute.CommandType = CommandType.StoredProcedure;
            DataTable toReturn = new DataTable("courier_user_listing");
            SqlDataAdapter adapter = new SqlDataAdapter(cmdToExecute);

            // Use base class' connection object
            cmdToExecute.Connection = sqMainConnection;

            try
            {
                cmdToExecute.Parameters.Add(new SqlParameter("@suser_name", SqlDbType.VarChar, 250, ParameterDirection.Input, true, 0, 0, "", DataRowVersion.Proposed, _user_name));


                if (blnMainConnectionIsCreatedLocal)
                {
                    // Open connection.
                    sqMainConnection.Open();
                }
                else
                {
                    if (CPMainConnectionProvider.IsTransactionPending)
                    {
                        cmdToExecute.Transaction = CPMainConnectionProvider.CurrentTransaction;
                    }
                }

                // Execute query.
                adapter.Fill(toReturn);
                i32ErrorCode = (Int32)cmdToExecute.Parameters["@iErrorCode"].Value;

                if (i32ErrorCode != (int)LLBLError.AllOk)
                {
                    // Throw error.
                    throw new Exception("Stored Procedure 'sp_courier_user_SelectAll' reported the ErrorCode: " + i32ErrorCode);
                }

                return toReturn;
            }
            catch (Exception ex)
            {
                // some error occured. Bubble it to caller and encapsulate Exception object
                throw new Exception("Courier_user::SelectAll::Error occured.", ex);
            }
            finally
            {
                if (blnMainConnectionIsCreatedLocal)
                {
                    // Close connection.
                    sqMainConnection.Close();
                }
                cmdToExecute.Dispose();
                adapter.Dispose();
            }

【问题讨论】:

  • “超时。” - 在假设您已经达到最大连接数之前,我可以想到很多超时的原因......
  • @MitchWheat - 没错,只有错误消息清楚地表明了最大连接数。
  • @DoanCuong 要求的是查看您如何打开和关闭连接。如果你没有正确关闭它们,你很容易导致连接池饥饿。
  • @Oded:是的,但是我在 .NET 和数据库方面做了很多工作,我还没有看到那个错误......
  • @Harshit - 请发布您的代码。如果没有看到您在做什么,我们无法给您具体的建议。

标签: c# asp.net sql-server


【解决方案1】:

检查数据库中任何长时间运行的查询。

增加你的池大小只会让你的 web 应用程序的寿命更长一点(并且可能会变得更慢)

您可以使用 sql server profiler 并根据持续时间/读取进行过滤,以查看哪些查询需要优化。

我还看到您可能正在保持全球连接?

blnMainConnectionIsCreatedLocal

让 .net 为您进行池化,并使用 using 语句打开/关闭您的连接。

建议:

  1. 始终打开和关闭这样的连接,因此 .net 可以管理您的连接并且您不会用完连接:

        using (SqlConnection conn = new SqlConnection(connectionString))
        {
         conn.Open();
         // do some stuff
        } //conn disposed
    
  2. 正如我所提到的,使用 sql server profiler 检查您的查询,看看是否可以优化它。在 Web 应用程序中对多个请求进行慢速查询也会导致这些超时。

【讨论】:

  • 通过增加连接字符串 Max Pool Size=100 中的最大池大小来解决问题
【解决方案2】:

你也可以试试....

运行您的应用程序....当它仍在运行时启动您的命令提示符

当您的应用程序运行时,在命令提示符下键入 netstat -n。您应该会看到 TCP/IP 连接列表。检查您的列表是否不是很长。理想情况下,列表中的连接数应少于 5 个。检查连接状态。
如果您有太多处于 TIME_WAIT 状态的连接,则表示连接已关闭并正在等待操作系统释放资源。如果您在 Windows 上运行,则默认临时端口范围在 1024 和 5000 之间,Windows 从 TIME_WAIT 状态释放资源的默认时间为 4 分钟。因此,如果您的应用程序在不到 4 分钟的时间内使用了超过 3976 个连接,您将收到异常。

修复建议:

  1. 将连接池添加到您的连接字符串。

如果您继续收到相同的错误消息(这极不可能),您可以尝试以下操作:(如果您不熟悉 Windows 注册表,请不要这样做)

  1. 从您的运行命令运行 regedit。在注册表编辑器中查找此注册表项:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters:

修改设置,使其变为:

MaxUserPort = dword:00004e20(10,000 十进制) TcpTimedWaitDelay = dword:0000001e(十进制 30)

这会将端口数增加到 10,000 个,并减少释放释放的 tcp/ip 连接的时间。

仅在建议 2 失败时使用建议 2。

谢谢。

【讨论】:

    【解决方案3】:

    这可能是所有时间的多连接打开问题,您在代码中的某个地方打开连接并且没有正确关闭它们。使用

     using (SqlConnection con = new SqlConnection(connectionString))
            {
                con.Open();
             }
    

    参考这篇文章:http://msdn.microsoft.com/en-us/library/ms254507(v=vs.80).aspxVisual Basic 或 C# 中的 Using 块会在代码退出块时自动释放连接,即使出现未处理的异常也是如此。

    【讨论】:

      【解决方案4】:

      在你开始诅咒你的应用程序之前,你需要检查一下:

      1. 您的应用程序是唯一使用该 SQL Server 实例的应用程序吗? 一种。如果答案是否定的,那么您需要调查其他应用程序如何消耗您的 SQl Server.run 上的资源 湾。如果答案是肯定的,那么您必须调查您的申请。

      2. 运行 SQL Server Profiler 并检查使用 SQL Server 的其他应用程序 (1a) 中发生的活动,并检查您的应用程序 (1b)。

      3. 如果您的应用程序确实缺乏资源,那么您需要进行进一步的调查。有关更多信息,请阅读http://sqlserverplanet.com/troubleshooting/sql-server-slowness

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-08-02
        • 2011-08-13
        • 2016-03-24
        • 1970-01-01
        • 1970-01-01
        • 2012-05-20
        • 1970-01-01
        相关资源
        最近更新 更多