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_); }
私が使用しているライブラリのバージョンは次のとおりです。
#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);
}
}