MongoDB C ++驱动程序处理副本集连接失败

时间:2013-07-24 17:51:51

标签: c++ mongodb

所以mongo c ++文档说

  

在故障转移情况下,预计至少会有一个操作返回   故障转移完成之前出错(抛出异常)。操作   没有重试

有点讨厌,但这让我无法处理失败的操作。理想情况下,我只想让应用程序休眠几秒钟(app是单线程的)。并重新启动,希望建立一个新的主要方法。在第二次失败的情况下,我认为连接真的搞砸了,我只是想抛出异常。

在我的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;
}

1 个答案:

答案 0 :(得分:0)

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

  • 记录您尝试过的次数
  • 创建一个带有终止符的while循环(count&lt; 5&amp;&amp; lastOpSucceeded)
  • 然后用pow(2,count)睡觉以在每次迭代中睡得更多。

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

相关问题