0

したがって、mongo C ++のドキュメントには次のように書かれています

フェールオーバーの状況では、フェールオーバーが完了する前に、少なくとも 1 つの操作でエラーが返される (例外がスローされる) ことが予想されます。操作は再試行されません

ちょっと面倒ですが、失敗した操作を処理するのは私に任されています。理想的には、アプリケーションを数秒間スリープさせたいだけです (アプリはシングル スレッドです)。そして、新しいプライマリ mongod が確立されることを期待して再試行します。2 回目の失敗の場合は、接続が本当にめちゃくちゃになっていると思います。例外をスローしたいだけです。

私の MongodbManager クラス内では、これはすべての操作にこの種の二重の try/catch ブロックが設定されていることを意味します。よりエレガントなソリューションがあるかどうか疑問に思っていましたか?

方法の例:

template <typename T>
std::string
MongoManager::insert(std::string ns, T object)
{
  mongo::BSONObj = convertToBson(object);
  std::string result;
  try {
    connection_->insert(ns, oo); //connection_ = shared_ptr<DBClientReplicaSet>
    result = connection_->getLastError();
    lastOpSucceeded_ = true;
  }
  catch (mongo::SocketException& ex)
  {
    lastOpSucceeded_ = false;
    boost::this_thread::sleep( boost::posix_time::seconds(5) );
  }

  // try again?
  if (!lastOpSucceeded_) {
    try {
      connection_->insert(ns, oo);
      result = connection_->getLastError();
      lastOpSucceeded_ = true;
    }
    catch (mongo::SocketException& ex)
    {
       //do some clean up, throw exception
    }
  }
  return result;
}
4

1 に答える 1