【发布时间】:2016-06-06 14:13:47
【问题描述】:
使用并行foreach 将数据插入数据库时,出现以下错误:
连接池已耗尽'
向数据库中插入一些数据后
try
{
var connection = ConfigurationManager.ConnectionStrings["Connection"].ConnectionString;
Parallel.ForEach(Enumerable.Range(0, 1000), (_) =>
{
using (var connectio = new NpgsqlConnection(connection))
{
connectio.Open();
using (var command = new NpgsqlCommand("fn_tetsdata", connectio) { CommandType = CommandType.StoredProcedure })
{
command.Parameters.AddWithValue("firstname", "test");
command.Parameters.AddWithValue("lastname", "test");
command.Parameters.AddWithValue("id", 10);
command.Parameters.AddWithValue("designation", "test");
command.ExecuteNonQuery();
}
connectio.Close();
}
});
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
【问题讨论】:
-
默认连接池大小为20,所以要么增加它,要么减少连接数。
-
我只是想知道你为什么要那样做......你确实意识到通常最好在一个批次中完成很多工作而不是抛出很多连接的线程,做一些工作,断开连接等?
-
我不相信默认池大小是 20 - stackoverflow.com/questions/18943703/…
-
@MurrayFoxcroft 他指的是 connection 池大小,而不是 thread 池大小,虽然我认为默认值是 100,而不是 20。无论如何,在这种情况下,绝对不需要创建多个 一个 连接。
-
同意,他应该打开一个,然后根据产生最佳性能的方式并行化/批处理,尽管 SQL 连接管理器应该在这里为你做一些 tintelligence。