【问题标题】:Error occurred while working with max pool size使用最大池大小时发生错误
【发布时间】:2018-12-25 15:31:26
【问题描述】:

在使用 ADO.Net C# 连接 SQL 数据库时,我在同时处理数千个数据时随机出现异常,这些数据正在线程中执行,例如

  • 已成功与服务器建立连接,但在登录前握手期间发生错误。 (提供者:SSL Provider,错误:0 - 等待操作超时。)

  • 由于登录前连接初始化过程出错,客户端无法建立连接。可能的原因包括:客户端尝试连接到不受支持的 SQL Server 版本;服务器太忙而无法接受新连接;或者服务器上存在资源限制(内存不足或允许的最大连接数)。 (提供者:TCP Provider,错误:0 - 现有连接被远程主机强行关闭。)

  • 超时。在从池中获取连接之前超时时间已过。这可能是因为所有池连接都在使用中并且已达到最大池大小。

我的连接字符串是

<add name="ConnDBString" connectionString="datasource;Initial Catalog=dbname;pooling=true;connection lifetime=120;Max Pool Size=1000" providerName="System.Data.SqlClient"/>  

在参考其他问题时,我已经优化了我的代码以建立连接,如下所示

public static int ExecuteNonQuery(string commandText, CommandType commandType, ref List<SqlParameter> parameters)
    {
        int result = 0;
        if (!string.IsNullOrEmpty(commandText))
        {
            using (var cnn = new SqlConnection(Settings.GetConnectionString()))
            {                    
                var cmd = cnn.CreateCommand();
                cmd.CommandText = commandText;
                cmd.CommandType = commandType;
                cmd.CommandTimeout = Convert.ToInt32(Settings.GetAppSetting("CommandTimeout") ?? "3600");
                cmd.Parameters.AddRange(parameters.ToArray());
                cnn.Open();
                result = cmd.ExecuteNonQuery();
                cmd.Dispose();                    
            }
        }
        return result;
    }

请指教。

【问题讨论】:

  • 你的数据库服务器内存不足了吗?
  • 是的,有时会这样。
  • 这听起来和你的第二个要点很一致?
  • 是否还有其他可能导致这些问题而不是 RAM 不足?
  • 是的 - 例如,您与数据库的连接可能比服务器可以处理的要多。发生这种情况的原因有很多。

标签: c# ado.net console-application sql-server-2014


【解决方案1】:

请确保您的内存是否达到@mjwills 所说的最大限制。 我写了一些东西。你可以试试这个,这可能会帮助你解决最大池大小问题。

 public static int ExecuteNonQuery(string commandText, CommandType commandType, ref List<SqlParameter> parameters)
        {
            int result = 0;
            if (!string.IsNullOrEmpty(commandText))
            {
                using (var cnn = new SqlConnection(Settings.GetConnectionString()))
                using (var cmd = cnn.CreateCommand())
                {
                    cmd.CommandText = commandText;
                    cmd.CommandType = commandType;
                    cmd.CommandTimeout = Convert.ToInt32(Settings.GetAppSetting("CommandTimeout") ?? "3600"); 
                    cmd.Parameters.AddRange(parameters.ToArray());
                    cnn.Open();
                    result = cmd.ExecuteNonQuery();
                    cnn.Close();
                }
            }
            return result;
        }

您也可以使此方法同步以利用您的内存。

【讨论】:

    猜你喜欢
    • 2012-03-05
    • 1970-01-01
    • 2017-07-21
    • 2011-08-13
    • 1970-01-01
    • 2017-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多