Есть ли способ изменить тайм-аут соединения C++? согласно этому отчету об ошибке, похоже, нет. Но в нем говорится, что есть простой способ обхода проблемы, и я не уверен, что.
https://jira.mongodb.org/browse/SERVER-3983
У меня есть autoreconnect on, и когда соединение с сервером идет вниз, кажется, что все приложение зависает в течение 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;
}
Как вы можете видеть, я хочу просто пропустить обновления/вставки, если соединение плохое, не блокируя основной поток.
Я могу реализовать потоки, но весь пакет программного обеспечения, с которым я работаю, похоже, не использует их, и я хотел бы избежать этого, если это возможно.
EDIT: эта публикация получает много трафика, но описывает, как создать официально устаревший драйвер Legacy C++. Драйвер Legacy C++ был устаревшим от нового драйвера C++ 11. Новый драйвер C++ 11 должен быть первым выбором при написании клиентского приложения в C++, которое будет связываться с MongoDB. Информацию о том, как создать новый драйвер C++ 11, можно найти здесь:
https://github.com/mongodb/mongo-cxx-driver/wiki/Quickstart-Guide-(New-Driver)
К сожалению, код клиента на сервере не изменится (пока). Однако вы можете использовать драйвер C++, который мы извлекли из сервера, и немного реорганизовать ваш код, чтобы сделать эту работу для вас. Выделенный драйвер называется драйвером "legacy", и мы внесли некоторые улучшения в его удобство использования.
У этой версии драйвера теперь есть проблема с записью по умолчанию "Acknowledged", означающая, что вы можете просто попробовать выполнить операцию записи, которую хотите сделать, и она либо преуспеет, либо выбросит ошибку. Это означает, что вам не нужно вызывать getLastError() самостоятельно.
Вы можете больше узнать о проблеме с подтвержденной записью или об изменении изменений в новом драйвере. В частности изменение поведения является здесь.
Тем не менее, в устаревших 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;
}