Я хочу, чтобы 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);
}
}