使用并行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);
}
答案 0 :(得分:4)
Constrain the amount of parralelism with MaxDegreeOfParallelism, by default it could be exceeding the number of DB connections you have. Find a balance between parallelising your work and not killing the DB :)
Sub Background_Lists()
a = 0
Range("E4:E2004").Clear
Range("B4:B2004").Value = Range("=Parts!B18:B2018").Value
Range("D4:D2004").Value = Range("=[B.xlsx]Sheet1!A2:A2002").Value
For i = 4 To 2004
If Cells(i, 4).Value >= 300000 Then
Cells(4 + a, 5).Value = Cells(i, 4).Value
a = a + 1
End If
Next i
答案 1 :(得分:2)
我假设您正在使用并行性来提高性能。如果是这种情况,那么首先需要一个基线。串行运行1,000个查询,每次创建一个新连接(实际上只从池中拉出一个)。
然后使用相同的连接对象进行尝试,看看性能是否有所改善。
然后使用来自命令对象尝试它,只需更改参数值。
然后使用相同的连接并行尝试,你没有创建1,000个连接对象,你已经尝试过了。
如果通过使用并行性获得显着的性能改进,我会感到惊讶,因为Parallel
提高了 CPU绑定任务和数据查询的性能I / O通常比CPU更受约束。