有没有办法更改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;
}
正如您所看到的,如果连接错误而不阻塞主线程,我想跳过更新/插入。
我可以实现线程,但我正在使用的整个软件包似乎都没有使用它们,我想尽可能避免这样做。
答案 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 ++驱动程序并稍微重构您的代码以使其适合您。提取的驱动程序称为“遗留”驱动程序,我们对其可用性进行了一些改进。
此版本的驱动程序现在具有“已确认”的默认写入关注,这意味着您可以简单地尝试您想要执行的写入操作,它将成功或抛出错误。这意味着您不需要调用getLastError()自己。
您可以详细了解Acknowledged write concern或breaking 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;
}