MongoDB обходной путь для блокировки соединения или изменения времени ожидания для соединения. [C ++]

0

Есть ли способ изменить тайм-аут соединения 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;
    }

Как вы можете видеть, я хочу просто пропустить обновления/вставки, если соединение плохое, не блокируя основной поток.

Я могу реализовать потоки, но весь пакет программного обеспечения, с которым я работаю, похоже, не использует их, и я хотел бы избежать этого, если это возможно.

Теги:

1 ответ

0
Лучший ответ

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", и мы внесли некоторые улучшения в его удобство использования.

Драйвер Legacy C++

У этой версии драйвера теперь есть проблема с записью по умолчанию "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;
}
  • 0
    Но не приведет ли это к остановке программы, пока она не попытается подключиться? Это проблема, и мы надеялись, что есть более простое решение, чем использование многопоточности.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню