3

私のmongoDBはMongoLabでホストされており、データを取得するためのコードとしてC#を使用しています。

mongoクエリの10回に1回は、例外をスローします。

System.Net.Sockets.SocketException: 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 at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)

私はMongoLabにその期間のログレポートを調査するように依頼しましたが、彼らは彼らの側から何もログインしていないと言って、正しいmongo例外処理を使用するようにアドバイスしました。

私の質問:C#でMongo例外をどのように処理する必要がありますか?

私は次のようにそれを行う必要があります。キャッチ内で1回または2回再度クエリを実行します。

   /*Connection part

    ----
    ----
    */
    List X<XYZ> = new List<XYZ>;
    try{
    var Query = from o in collection.AsQueryable<XYZ>()
                             where ...
                             select o;

    List= Query.ToList();
    }
    catch(MongoException e){
var Query = from o in collection.AsQueryable<XYZ>()
                             where ...
                             select o;
    List= Query.ToList();
    }

よろしくお願いします。

4

1 に答える 1

8

プログラムロジックの実質的な部分をcatch句の中に入れてはいけません。例外が2回スローされた場合はどうなりますか?言い換えれば、catch句のすべては、失敗しないことが保証されるように十分に単純でなければなりません。

できることは、ブロック全体をループに入れ、事前に決定された(または構成可能な)回数失敗した場合に終了するように再試行カウンターを設定することです。

List<XYZ> list = null;
const int maxRetries = 3; // could also be a configuration parameter

int retries = maxRetries;
while ((retries > 0) && (list == null)) {
  try{
    var Query = from o in collection.AsQueryable<XYZ>()
                         where ...
                         select o;

    list = Query.ToList();
  }
  catch {
    retries--;

    if (retries < 1) {
      throw;
    }
  }
}

これにより、クエリが最大3回試行されます。クエリが成功してListに正常に変換されると、ループは終了します。例外がスローされると、再試行カウンターがデクリメントされます。再試行の最大数に達すると、例外が再スローされます。

于 2012-08-14T23:21:06.083 に答える