使用最大池大小时发生错误

时间:2018-12-19 10:10:36

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

在使用ADO.Net C#的SQL数据库连接中,同时处理成千上万的数据(同时在诸如此类的线程中执行)时,我会随机获取异常

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

  • 由于登录之前的连接初始化过程中发生错误,客户端无法建立连接。可能的原因包括:客户端试图连接到不受支持的SQL Server版本;客户端尝试连接到不支持的版本。服务器太忙,无法接受新连接;或服务器上存在资源限制(内存不足或允许的最大连接数)。 (提供者:TCP提供程序,错误: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;
    }

请告知。

1 个答案:

答案 0 :(得分:0)

请确保您的内存是否达到@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;
        }

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