我必须在SQL中存储很多行。这是我在C#中的一些伪代码:
using (var con = new SqlConnection(ConfigurationManager.ConnectionStrings["DataContext"].ConnectionString))
{
await con.OpenAsync();
var sc = new SqlCommand("InsertUpdateMyobject", con);
sc.CommandType = CommandType.StoredProcedure;
sc.Parameters.AddWithValue("code", h.Code);
await sc.ExecuteNonQueryAsync();
// two more stored proc calls
}
我已将3个存储过程移动到一个,以限制sqlcommands的执行。有一个int作为输出参数,其中包含scope_identity()。我在我的连接字符串中添加了这个:
MultipleActiveResultSets = False; Encrypt = True; TrustServerCertificate = False; Connection Timeout = 30; ConnectRetryCount = 3; ConnectRetryInterval = 10; TransparentNetworkIPResolution = False; Max Pool Size = 60
还尝试将Asynchronous Processing=true;
添加到连接字符串。
我已将Max pool size
设置为60,因为我使用的是S0 Azure SQL数据库。我不想扩展到S1,S2或S3。我只是希望代码执行不会抛出异常,只是等待一段时间再下一次执行。我正在使用.net 4.6.2运行一个控制台应用程序,以便支持连接字符串中的重试部分。
当我运行sql部件大约100次时,我得到一个包含超过60个内部异常的聚合异常:
这是荷兰语,并说:
超时已过期。操作完成之前经过的超时时间或服务器没有响应
及以下:
超时已过期。从池中获取连接之前经过的超时时间。这可能是因为所有池连接都在使用中并且达到了最大池大小。
我的存储过程仅对3个表进行插入和删除,并在int(输出参数)中返回其中一个表的新主键。 (主要,父表有2个孩子,表)
看起来有点像Max pool size was reached error for parallel connections 但我没有datareader或表。输出只有一个int。 PS。这个应用程序是目前唯一一个击中天蓝色数据库的应用程序。