Как установить таймаут mysql_ping с MySQL++

Я хочу, чтобы mysql_ping истекал через несколько секунд. В приведенном ниже тесте, если установлено соединение с последующим "ifconfig eth0 down", ложная сторона conn.ping() никогда не достигается. Поток / процесс входит в то, что кажется бесконечным ожиданием. Я хочу изменить это и сократить время ожидания, предпочтительно используя параметры MySQL++. Есть идеи, какой вариант это может быть?

Может быть, мне также нужно установить, сколько раз он будет повторяться?

Читая документацию по MySQL, он сообщает, что mysql_ping попытается выполнить автоматическое переподключение. Что хорошо, но в конце концов я бы хотел, чтобы это время истекло.

http://dev.mysql.com/doc/refman/5.1/en/mysql-options.html http://dev.mysql.com/doc/refman/5.1/en/mysql-ping.html

Так как он выполняет автоматическое переподключение, MYSQL_OPT_CONNECT_TIMEOUT выглядит как путь. Однако в приведенном ниже тесте установка mysqlpp::ConnectTimeoutOption(1) не помогает.

Похоже, что MySQL++ ping() - это просто оболочка для C API, я собрал это из "/usr/include/mysql++/dbdriver.h", который определяет ping () как:

bool ping () {return! mysql_ping (& mysql_); }

Версии библиотек, которые я использую:

  • libmysql ++ - dev: 3.0.9-1 + b1
  • libmysql ++ 3: 3.0.9-1 + b1
  • mysql-client-5.1: 5.1.49-3
  • 
    #include <iostream>
    #include <mysql++/mysql++.h>
    
    //g++ -o test -I/usr/include/mysql/ -lmysqlpp testcase_mysql_timeout.cpp
    int main(int argc, char *argv[]) {
        mysqlpp::Connection conn;
    
        conn = mysqlpp::Connection(true);
        try {
            conn.set_option(new mysqlpp::MultiStatementsOption(true));
            conn.set_option(new mysqlpp::ConnectTimeoutOption(1));
            conn.set_option(new mysqlpp::InteractiveOption(true));
        }
        catch (mysqlpp::BadOption &e) {
            std::cerr << "ConnectDB exception: " << e.what() << std::endl;
        }
        conn.connect("MyDB", "my.dyndns.org", "user", "password", 3306);
    
        while(1) {
            if (!conn.ping()) {
                std::cout << "Host not reachable. Try to reconnect?" << std::endl;
            }
            else {
                std::cout << "Host is reachable all is good." << std::endl;
            }
            usleep(1000000);
        }
    }
    
    

    1 ответ

    Боюсь, я должен ответить на свой вопрос:)

    Чтение большего количества документации MySQL дало ответ. Установка таймаута подключения в этом случае делает очень мало. Он все еще должен ждать TCP/IP Close_Wait_Timeout со значением по умолчанию 10 минут:

    http://dev.mysql.com/doc/refman/5.1/en/mysql-options.html

    MYSQL_OPT_READ_TIMEOUT (тип аргумента: без знака int *)

    Тайм-аут в секундах для попыток чтения с сервера. Каждая попытка использует это значение тайм-аута, и при необходимости повторяются попытки, поэтому общее эффективное время ожидания в три раза превышает значение параметра. Вы можете установить это значение так, чтобы потерянное соединение могло быть обнаружено раньше, чем значение TCP/IP Close_Wait_Timeout, равное 10 минутам. До MySQL 5.1.41 эта опция применялась только к соединениям TCP / IP и, до MySQL 5.1.12, только для Windows.

    Другие вопросы по тегам