【发布时间】:2023-03-03 08:33:18
【问题描述】:
我有一个范围类
public class avl_range
{
public long start { get; set; }
public long end { get; set; }
}
如果我使用普通的FOR 效果很好,但必须等待每个命令完成并且每个查询需要 8 秒,所以 10 个查询需要 80 秒。
在并行版本中,如果我只打印范围可以完美,但如果尝试执行命令说已经在进行中。
{“一个操作已经在进行中。”}
我该如何解决这个问题?
var numbers = new List<avl_range>();
using (var conn = new NpgsqlConnection(strConnection))
{
conn.Open();
Action<avl_range> forEachLoop = number => //Begin definition of forLoop
{
// only the console write line works ok
Console.WriteLine(number.start + " - " + number.end);
using (var cmd = new NpgsqlCommand())
{
cmd.Connection = conn;
cmd.CommandText = String.Format( "SELECT * FROM avl_db.process_near_link({0}, {1});"
, number.start
, number.end);
// here cause the error.
using (var reader = cmd.ExecuteReader())
{
while (reader.Read())
{
Console.WriteLine(reader.GetString(0));
}
}
}
};
Parallel.ForEach(numbers, forEachLoop);
}
);
仅供参考:我正在尝试解决此问题,我将其发布before
【问题讨论】:
-
在微软的 SQL server 中,这会导致错误,因为在同一个连接上不能有多个打开的记录集(不启用 MARS)。我不知道您的 SQL 提供程序是否以相同的方式实现,但我猜很有可能。
-
在并行 foreach 中创建一个新的
NpgsqlConnection怎么样? -
@BradleyUffner 你能提供一些文件吗?我可以尝试,但对我来说似乎没有逻辑为每个查询创建不同的连接。
-
这适用于微软的 SQL 实现。我不能肯定地说 postressql,因为我从未使用过它,但值得一试。只要它汇集连接,它就不应该有太多的性能损失。
-
这个stackoverflow.com/questions/8803733/… 似乎表明prostgresql 没有MARS 等效功能。
标签: c# sql postgresql npgsql parallel.for