【问题标题】:The connection pool has been exhausted连接池已耗尽
【发布时间】: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。

标签: c# npgsql


【解决方案1】:

使用 MaxDegreeOfParallelism 限制并行量,默认情况下它可能超过您拥有的数据库连接数。在并行工作和不杀死数据库之间找到平衡:)

Parallel.ForEach(yourListOfStuff,
    new ParallelOptions { MaxDegreeOfParallelism = 10 },
    stuff => { YourMethod(stuff); }
);

【讨论】:

    【解决方案2】:

    我假设您正在使用并行性来提高性能。如果是这种情况,那么首先你需要一个基线。串行运行 1,000 个查询,每次都创建一个新连接(实际上只是从池中拉出一个)。

    然后用 same 连接对象试试,看看性能有没有提升。

    那就用自带的command对象试试吧,只是改变参数值。

    然后尝试并行使用相同的连接因为您没有创建 1,000 个连接对象,您已经尝试过。

    如果您通过使用并行性获得了显着的性能提升,我会感到惊讶,因为Parallel 提高了CPU-bound 任务的性能,并且数据查询通常是I/O 比 CPU 更受约束。

    【讨论】:

      猜你喜欢
      • 2017-07-10
      • 1970-01-01
      • 2015-06-04
      • 1970-01-01
      • 2022-07-24
      • 2017-03-25
      • 2011-01-19
      相关资源
      最近更新 更多