1

mysql_ping を数秒でタイムアウトさせたい。以下のテストケースでは、接続が確立された後に「ifconfig eth0 down」が続く場合、conn.ping() の false 側には到達しません。スレッド/プロセスは、終わりのない待機のように見えます。これを変更して、できれば 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 の単なるラッパーのようです。ping() を次のように定義する「/usr/include/mysql++/dbdriver.h」からこれを収集しました。

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

私が使用しているライブラリのバージョンは次のとおりです。

  • libmysql++-dev: 3.0.9-1+b1
  • libmysql++3: 3.0.9-1+b1
  • mysql クライアント 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);
        }
    }
    
    
    4

    1 に答える 1

    3

    私は自分の質問に答えなければならないのではないかと心配しています:)

    MySQLのドキュメントをもう少し読むと、答えが得られました。この場合、接続タイムアウトを設定してもほとんど効果がありません。デフォルトの 10 分の TCP/IP Close_Wait_Timeout を待機する必要があります。

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

    MYSQL_OPT_READ_TIMEOUT (引数の型: unsigned int *)

    サーバーからの読み取り試行のタイムアウト (秒単位)。各試行でこのタイムアウト値が使用され、必要に応じて再試行されるため、有効なタイムアウト値の合計はオプション値の 3 倍になります。TCP/IP Close_Wait_Timeout 値の 10 分よりも早く接続の切断を検出できるように、値を設定できます。MySQL 5.1.41 より前では、このオプションは TCP/IP 接続にのみ適用され、MySQL 5.1.12 より前では Windows にのみ適用されます。

    于 2011-02-22T15:29:59.187 に答える