したがって、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;
}