一尘不染

我可以将Parallel.For与sql命令一起使用吗?

sql

我有一类范围

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);
    }
 );

阅读 148

收藏
2021-03-10

共1个答案

一尘不染

Npgsql连接不能同时使用-在任何给定时间点只能运行一个命令(换句话说,没有MARS支持)。

打开多个连接以并行执行查询可能绝对有意义。尽管建立新的物理连接非常昂贵,但是连接池非常轻巧,因此重用物理连接的开销很小。不执行此操作的主要原因是,如果您需要在同一事务中进行多个操作。

2021-03-10