我希望 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() { 返回 !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);
}
}