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" 驱动程序,我们对其可用性进行了一些改进。
此版本的驱动程序现在具有 "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;
}
有没有办法改变 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" 驱动程序,我们对其可用性进行了一些改进。
此版本的驱动程序现在具有 "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;
}