使用 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.
抱歉,如果这个问题看起来重复,但我无法从其他答案中找到解决方案。 我有一个使用 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.