用于阻止连接或更改连接超时的MongoDB解决方法。 [C ++]

时间:2015-01-08 11:34:29

标签: c++ mongodb

有没有办法更改C ++连接超时?根据这个错误报告,似乎没有。但它说有一个简单的解决方法,我不知道是什么。

https://jira.mongodb.org/browse/SERVER-3983

我有自动连接,当与服务器的连接断开时,似乎整个应用程序在尝试重新连接时挂起5秒。什么是解决方案?有没有办法进行非阻塞connect通话?我确实检查连接是否打开,

if(conn->isStillConnected ()){
        try {
            conn->insert(ns, obj, flags);
            std::string e = conn->getLastError();
            if( !e.empty() ) { 
                std::string err = "Insert failed: ";
                ...
                return false;
            }
        }
        catch (mongo::DBException& e) {
            ...
            return false;
        }
    }
    else {
        return false;
    }

正如您所看到的,如果连接错误而不阻塞主线程,我想跳过更新/插入。

我可以实现线程,但我正在使用的整个软件包似乎都没有使用它们,我想尽可能避免这样做。

1 个答案:

答案 0 :(得分:0)

编辑:此帖子获得了大量流量,但介绍了如何构建现已正式过时的“Legacy C ++”驱动程序。 Legacy C ++驱动程序已被新的C ++ 11驱动程序淘汰。在用C ++编写将与MongoDB通信的客户端应用程序时,新的C ++ 11驱动程序应该是首选。有关如何构建新C ++ 11驱动程序的信息,请访问:

https://github.com/mongodb/mongo-cxx-driver/wiki/Quickstart-Guide-(New-Driver)

不幸的是,服务器中的客户端代码不会改变(暂时)。但是,您可以使用我们从服务器中提取的C ++驱动程序并稍微重构您的代码以使其适合您。提取的驱动程序称为“遗留”驱动程序,我们对其可用性进行了一些改进。

Legacy C++ Driver

此版本的驱动程序现在具有“已确认”的默认写入关注,这意味着您可以简单地尝试您想要执行的写入操作,它将成功或抛出错误。这意味着您不需要调用getLastError()自己。

您可以详细了解Acknowledged write concernbreaking changes in the new driver。具体而言,行为更改为here

但是,旧版C ++驱动程序中目前没有配置连接超时的选项,不幸的是我们不太可能在此时添加一个并更改网络代码。

我的建议是不使用isStillConnected或autoreconnect,只需尝试操作(默认情况下现在需要传统驱动程序中的响应)。

bool doInsert(const std::string& ns, const BSONObj& obj, int flags) {
    try {
        conn->insert(ns, obj, flags);
    }
    catch (mongo::OperationException& e) {
        return false;
    }
    return true;
}