所以mongo c++文档说
在故障转移情况下,预计至少有一个操作在故障转移完成之前返回错误(引发异常)。不重试操作
有点烦人,但这让我来处理失败的操作。理想情况下,我只想让应用程序休眠几秒钟(应用程序是单线程的)。并重试,希望建立一个新的主要 mongod。在第二次失败的情况下,我认为连接确实搞砸了,我只想抛出一个异常。
在我的 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;
}