2011-06-21 12 views
1

私は接続メソッドのタイムアウトを制御しようとしていますが、適切な平均が見つかりませんでした。mysqlpp接続メソッドのタイムアウト - どのように制御できますか?

私はアイドル接続タイムアウト(ConnectTimeoutOption)について話していません。

私が対処しなければならないシナリオは、データベースがなくなったことです。私のサーバーはこれに対処しなければなりません。私の現在の扱いは、私がサーバーにpingをしていることです.pingが失敗したことがわかったら、100秒間クエリを停止します。その後、私は接続を再確立しようとしています。問題は、データベースがまだ死んでいる場合、connectメソッドが(ネットワークケーブルを引っ張ってシミュレートできる)約20秒かかってしまいます。

ありがとうございます。

答えて

4

これは

#include <mysql++.h> 
#include <cstdio> 

int main() 
{ 
    mysqlpp::Connection conn; 
    conn.set_option(new mysqlpp::ReconnectOption(true)); 
    conn.set_option(new mysqlpp::ConnectTimeoutOption(5)); 

    const std::string db="mysql_cpp_data"; 
    const std::string query_text="SELECT count(*) as total FROM stock"; 
    conn.connect(db.c_str(), "somehost", "user", "pass"); 

    try 
    { 
     mysqlpp::Query query=conn.query(); 
     query << query_text; 
     mysqlpp::StoreQueryResult res=query.store(); 
     std::cout << "Has " << (*res.begin())[0] << " rows\n"; 
    } 
    catch(const mysqlpp::BadQuery &e) 
    { 
     std::cout << "EXCEPTION: " << e.what() << std::endl; 
    } 
    std::cout << "Make database go away now and press a key\n"; 
    getchar(); 

    try 
    { 
     mysqlpp::Query query=conn.query(); 
     query << query_text; 
     mysqlpp::StoreQueryResult res=query.store(); 
     std::cout << "Has " << (*res.begin())[0] << " rows\n"; 
    } 
    catch(const mysqlpp::BadQuery &e) 
    { 
     std::cout << "EXCEPTION: " << e.what() << std::endl; 
     std::cout << "Make database come back now and press a key\n"; 
     getchar(); 
     while(!conn.ping()) 
     { 
     sleep(1); 
     std::cout << "Waiting for DB to come back\n"; 
     } 
     if(!conn.select_db(db)) 
     { 
     std::cout << "Failed to change DB\n"; 
     } 
    } 

    try 
    { 
     mysqlpp::Query query=conn.query(); 
     query=conn.query(); 
     query << query_text; 
     mysqlpp::StoreQueryResult res=query.store(); 
     std::cout << "Has " << (*res.begin())[0] << " rows\n"; 
    } 
    catch(const mysqlpp::BadQuery &e) 
    { 
     std::cout << "EXCEPTION: " << e.what() << " " << e.errnum() << std::endl; 
    } 

    return 0; 
} 
のために働く必要があります
関連する問題