gpt4 book ai didi

c# - Parallel.ForEach 使用 NpgsqlConnection

转载 作者:行者123 更新时间:2023-11-29 13:56:27 31 4
gpt4 key购买 nike

我在 Parallel.ForEach 中使用 Npgsqlconnection,循环遍历列表中的内联查询。

当我达到 1400+ 左右的数字时,我得到一个异常提示

'FATAL: 53300: remaining connection slots are reserved for non-replication superuser connections'.

我正在使用

 Pooling=true;MinPoolSize=1;MaxPoolSize=1024;ConnectionLifeTime=1 

在我的 app.configcon.Close()con.ClearPool()con.Dispose() 在我的代码中。

Parallel.ForEach(查询,查询=> { 使用 (NpgsqlConnection con = new NpgsqlConnection(ConfigurationManager.ConnectionStrings["PSQL"].ConnectionString)) { con.ClearPool(); con.Open();

                        //int count = 0;
int queryCount = queries.Count;

using (NpgsqlCommand cmd = con.CreateCommand())
{
cmd.CommandType = CommandType.Text;
//cmd.CommandTimeout = 0;

cmd.CommandText = query;
cmd.ExecuteNonQuery();

count += 1;
this.label1.Invoke(new MethodInvoker(delegate { this.label1.Text = String.Format("Processing...\n{0} of {1}.\n{2}% completed.", count, queryCount, Math.Round(Decimal.Divide(count, queryCount) * 100, 2)); }));
}

con.Close();
//con.Dispose();
//con.ClearPool();
}
});

最佳答案

您正在达到 postgresql 本身的最大连接限制:

http://www.postgresql.org/docs/9.4/static/runtime-config-connection.html#GUC-MAX-CONNECTIONS

您的并行查询正在获得大量连接,而服务器无法处理。默认情况下,Postgresql 配置为允许 100 个并发连接。也许你应该尝试在你的 postgresql.conf 文件中增加这个值。

另一种选择是将 Npgsql 的池大小限制为较低的数字。当达到最大池大小时,您的并发查询将等待。

另外,不要调用 ClearPool,因为这会增加池逻辑的开销并且根本不会从池中受益。您可以尝试在连接字符串中设置 Pool=false

希望对你有帮助。

关于c# - Parallel.ForEach 使用 NpgsqlConnection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30836847/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com