gpt4 book ai didi

.net - 如何阻止 NpgsqlDataReader 阻塞?

转载 作者:行者123 更新时间:2023-11-29 12:01:24 25 4
gpt4 key购买 nike

针对大型 PostgreSQL 表运行以下代码,NpgsqlDataReader 对象会阻塞,直到获取所有数据。

NpgsqlCommand cmd = new NpgsqlCommand(strQuery, _conn);
NpgsqlDataReader reader = cmd.ExecuteReader(); // <-- takes 30 seconds

如何让它不预取所有数据?我想逐行遍历结果集,而不是让它一次将所有 15 GB 提取到内存中。

我知道 Npgsql 1.x 中存在此类问题,但我使用的是 2.0。这是针对 XP/Vista/7 上的 PostgreSQL 8.3 数据库。我的连接字符串中也没有任何时髦的“强制 Npgsql 预取”内容。我完全不知道为什么会这样。

最佳答案

我很惊讶驱动程序没有提供执行此操作的方法——但您可以手动执行 SQL 语句来声明一个游标,打开它并从中批量获取。即(这段代码非常可疑,因为我不是 C# 人):

new PgsqlCommand("DECLARE cur_data NO SCROLL CURSOR AS "
+ strQuery, _conn).ExecuteNonQuery();
do {
NpgsqlDataReader reader = new NpgsqlCommand("FETCH 100 FROM cur_data", _conn)
.ExecuteReader();
int rows = 0;
// read data from reader, incrementing "rows" for each row
} while (rows > 0);
new PgsqlCommand("CLOSE cur_data", _conn).ExecuteNonQuery();

注意:

  • 您需要在事务 block 内才能使用游标,除非您在声明它时指定“HOLD”选项,在这种情况下,服务器会将结果假脱机到服务器端临时文件(您不会不过必须一次全部转移)
  • cursor_tuple_fraction 设置可能会导致在通过游标执行查询时使用不同的计划,而不是在立即模式下。您可能想在声明游标之前执行“SET cursor_tuple_fraction=1”,因为您实际上打算获取游标的所有输出。

关于.net - 如何阻止 NpgsqlDataReader 阻塞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2983285/

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