0

所以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;
}
4

1 回答 1

0

这确实是您需要处理的方式。也许我不会使用两个 try/catch 块,而是使用以下策略:

  • 记录你尝试了多少次
  • 创建一个作为终止符的 while 循环(计数 < 5 && lastOpSucceeded)
  • 然后用 pow(2,count) 睡觉,以便在每次迭代中睡得更多。

然后当所有其他方法都失败时,纾困。

于 2013-07-25T10:40:49.567 回答