我需要在数十个不同的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倍。任何帮助都会有很大的帮助。
答案 0 :(得分:0)
所以我只是一个白痴并且将我生成的结果集与我运行的所有查询的UNION进行比较而不是UNION ALL,因此我的“真实”结果集中没有重复项,因为联合正在删除它们: /