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

MongoDB workaround for blocking connection or change timeout for connecting. [C++]

有没有办法改变 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;
    }

如您所见,如果连接不好,我想跳过 updates/inserts 而不会阻塞主线程。

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

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

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

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

Legacy C++ Driver

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

您可以阅读有关 Acknowledged write concern or breaking changes in the new driver. Specifically the behavior changes are 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;
}