2013-07-24 35 views
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; 
} 
+0

與C#驅動程序有同樣的問題...想知道try/catch/retry是否只是一個必要的邪惡......? –

回答

0

這確實是那種你需要如何處理它。也許不是有兩個try/catch塊我會用以下策略:

  • 保持你已經嘗試了多少次
  • 創建while循環計數作爲結束(計數 & lastOpSucceeded)
  • 然後睡覺pow(2,count)在每次迭代中睡得更多。

然後,當所有其他的失敗,救市。