多线程NpgsqlConnections和读取器产生重复的结果。 C#

时间:2016-05-19 23:48:55

标签: npgsql

我需要在数十个不同的Schema上运行10个以上的数据库。我试图线程化这些查询并使用BlockingCollection将结果写入,同时还使用另一个线程从该集合中读取并将其写入磁盘,因为这些查询的结果集太大而无法存储在内存中。

以下是我的代码中的问题区域:

public class Node {
    public string ConnectionString;
    public string Query;

    public Node(string databaseDetails, string query) {
        //Cannot put in actual logic, but this part is fine
        ConnectionString = {logic for connection string}
        Query = "set search_path to {schema from databaseDetails};" + query
    }
}

public void runQuery(string query, BlockingCollection<Dictionary<string, object>> producer) {
        List<Node> nodes = getNodes(query);
        Parallel.ForEach(nodes, node => {
            NpgsqlConnection conn = new NpgsqlConnection(node.ConnectionString);
            conn.Open();
            NpgsqlCommand npgQuery = new NpgsqlCommand(node.Query, conn);
            NpgsqlDataReader reader = npgQuery.ExecuteReader();
            while (reader.Read()) {
                Dictionary<string, object> row = new Dictionary<string, object>();
                for (int i = 0; i < reader.FieldCount; i++) {
                    row[reader.GetName(i)] = reader.GetValue(i);
                }
                producer.Add(row);
            }
            conn.Close();
        });
        producer.CompleteAdding();
}

此代码运行并检索所有结果,但它也复制了大量结果,因此阻塞集合的记录数量应该超过应有的5-10倍。任何帮助都会有很大的帮助。

1 个答案:

答案 0 :(得分:0)

所以我只是一个白痴并且将我生成的结果集与我运行的所有查询的UNION进行比较而不是UNION ALL,因此我的“真实”结果集中没有重复项,因为联合正在删除它们: /