在使用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;
}
请告知。
答案 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;
}
您还可以使此方法同步以利用您的内存。