使用 npgsql 从 postgre 读取 'parallel'

Reading in 'parallel' from postgre using npgsql

抱歉,如果这个问题看起来重复,但我无法从其他答案中找到解决方案。 我有一个使用 Npgsql 访问的 postgre 数据库。 我有多个客户端同时从数据库读取。 我遇到异常 - 操作正在进行中。 我知道背后的原因。 我正在使用

public bool ReadRecord(arguments)
{
....
    NpgsqlDataReader reader = cmd.ExecuteReader();
    while (reader.Read())
    {
    ...
    }
...
}

调用例程

private void GetBundleIdAndIsWat(arguments)
{
...
    TaskQueue.GlobalInstance.AddTaskQueue(new Task<bool>(ReadRecord, InputData), tokenSource);
...
}

虽然 reader 未针对给定线程处理掉,但另一个无法执行命令。

所有多个线程如何同时从数据库读取? ExecuteReaderAsync 一次只允许一个线程执行命令吗? 这样的话,我就不能同时阅读了吧? 我阅读了有关 连接池 但真的不知道如何实现它。

How do all multiple threads read from the DB simultaneously?

您似乎在并行操作之间共享单个数据库连接。
每次操作只需使用单独的连接。

请注意:

  • 并行连接数受连接池大小和 PostgreSQL 的限制。连接池大小默认限制为 100 个连接,您可以通过在连接字符串中设置 MaxPoolSize 参数来更改它。 PostgreSQL 通过 postgresql.conf 中的 max_connections 参数限制了这一点,默认情况下这个也设置为 100。注意,一百个并行连接是一个相当大的值,不要增加它,直到你 真的需要这个。

  • 你提到了线程,但这是使用并行 任务 和异步代码而不是线程的一个很好的候选者。这也将允许以更有效的方式利用连接。

I read about Connection Pool but don't really know how to implement it

你不需要自己实现连接池。
做得好的 ADO .NET 提供程序已经实现了它。 只需像往常一样使用连接、命令和读取器:创建、使用、dispose.