2016-05-24 10 views
1

私は、5つの異なるデータベース上の何百ものクエリの結果を、プロデューサ - コンシューマパターンを使用してディスク上のファイルにストリームするプロセスを持っています。シーケンシャルに実行すると、クエリと接続はすべて動作します(または、それらを同時に並行して再試行した場合)。ただし、スレッドをスレッド化すると、接続の一部が失敗します。マルチスレッド時にPostgreSQLに接続できません。 C#

私は現在、失敗したコレクションに失敗した試みを追加して再帰的に再実行するため、最終的にすべて終了しますが、失敗した接続では多くの時間が浪費されます。

public void executeNodes(List<Node> nodeList, BlockingCollection<Dictionary<string, object>> producer, int retryAttempts) { 
     BlockingCollection<Node> retryNodes = new BlockingCollection<Node>(); 
     Parallel.ForEach(nodeList, new ParallelOptions() { MaxDegreeOfParallelism = 10 }, node => { 
      NpgsqlConnection conn = new NpgsqlConnection(node.ConnectionString); 
      try { 
       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(); 
       //Console.WriteLine("Success"); 
      } catch (Exception e) { 
       //Console.WriteLine("Failed"); 
       retryNodes.Add(node); 
      } 
     }); 
     if (retryNodes.Count == 0 || retryAttempts == 0) producer.CompleteAdding(); 
     else executeNodes(retryNodes.ToList<Node>(), producer, retryAttempts - 1); 
    } 

ノードは単純である:ここで

は、私が使用しています関連するコードです

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

    public Node(string connectionString, string query) { 
     ConnectionString = connectionString; 
     Query = query; 
    } 
} 

このプロセスが正常と正しく動作しますが、私が接続を取得していますことを迷惑です失敗。どんな助けでも大歓迎です。

注:

私が追加しようとしている:私は、レジストリエントリ specified in this page

接続障害を追加しようとしている

ServicePointManager.DefaultConnectionLimit = 20; 

到達している接続プールによるものではありません。私は見てい

エラーは以下のとおりです。

"Unable to read data from the transport connection: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond." 
+0

問題が発生し始めた接続数はどれくらいですか?あなたはプールが使用されていることと、あなたが一時的なポートを使い果たしていないことは確かですか? – 9Rune5

+0

私はノード数を10に制限し、そのうちの1つを1つのデータベースに、他の9つを別のデータベースに制限しました。私が最初の接続を実行するたびに常に成功ですが、他のすべては成功したかどうかにかかわらずほぼランダムに見えます。場合によっては6/10が最初の作業だけで動作することもあります。利用可能な一時的なポートの数を確認する方法を知っていますか?編集して、もう一度実行し、最初のものだけが失敗し、残りが成功したので、前のステートメントは部分的に偽でした。 –

+0

TCPポートの数は何千ものランクです。一握りの接続の後に問題がある場合は、私のコメントを忘れてください。 – 9Rune5

答えて

1

だから私の問題は、接続プーリングとありました。接続文字列でfalseに設定すると、すべて正常に機能しました。