0
所以蒙戈C++文件說MongoDB的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;
}
與C#驅動程序有同樣的問題...想知道try/catch/retry是否只是一個必要的邪惡......? –