mysqlpp连接方法超时-我如何控制它

mysqlpp connect method timeout - how can I control it?

本文关键字:控制 何控制 方法 连接 超时 mysqlpp      更新时间:2023-10-16

我试图控制连接方法超时,但没有找到合适的平均值。

需要明确的是,我不是在谈论空闲连接超时(ConnectTimeoutOption)。

我需要处理的场景是数据库消失,而我的服务器必须处理这个问题。我目前的处理方式是对服务器进行ping,如果我注意到ping失败,我将暂停查询100秒。在那之后,我正试图重新建立联系。问题是,如果数据库仍然是死的,那么连接方法需要大约20秒的时间来回答(可以通过拉动网络电缆来模拟),这对我来说太多了。

这应该适用于

#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] << " rowsn";
   }
   catch(const mysqlpp::BadQuery &e)
   {
      std::cout << "EXCEPTION: " << e.what() << std::endl;
   }
   std::cout << "Make database go away now and press a keyn";
   getchar();
   try
   {
      mysqlpp::Query query=conn.query();
      query << query_text;
      mysqlpp::StoreQueryResult res=query.store();
      std::cout << "Has " << (*res.begin())[0] << " rowsn";
   }
   catch(const mysqlpp::BadQuery &e)
   {
      std::cout << "EXCEPTION: " << e.what() << std::endl;
      std::cout << "Make database come back now and press a keyn";
      getchar();
      while(!conn.ping())
      {
         sleep(1);
         std::cout << "Waiting for DB to come backn";
      }
      if(!conn.select_db(db))
      {
         std::cout << "Failed to change DBn";
      }
   }
   try
   {
      mysqlpp::Query query=conn.query();
      query=conn.query();
      query << query_text;
      mysqlpp::StoreQueryResult res=query.store();
      std::cout << "Has " << (*res.begin())[0] << " rowsn";
   }
   catch(const mysqlpp::BadQuery &e)
   {
      std::cout << "EXCEPTION: " << e.what() << " " << e.errnum() << std::endl;
   }
   return 0;
}

尝试一下。

    #include <iostream>
    #include <iomanip>
    #include <cstdio>
    #include <cmdline.h>
    #include <mysql++.h>
    #define DBS "library"
    #define USR "root"
    #define PAS "rootsman"
    using namespace std;
    using namespace mysqlpp;
    int main(int argc, char *argv[]) {
        //for true cgi but in this case it works, kind of baffling!
        mysqlpp::examples::CommandLine cmdline(argc, argv, USR, PAS);
        if (!cmdline) return 1;
        mysqlpp::Connection conn(true);
        conn.set_option(new mysqlpp::ReconnectOption(true));
        conn.set_option(new mysqlpp::ConnectTimeoutOption(5));
        conn.connect(DBS, cmdline.server(), cmdline.user(), cmdline.pass());
        try {
            mysqlpp::String sql("select firstname from person");
            mysqlpp::Query query = conn.query(sql);
            mysqlpp::StoreQueryResult res = query.store();
            mysqlpp::StoreQueryResult::const_iterator it;
            int count = 1;
            for (it = res.begin(); it != res.end(); ++it) {
                mysqlpp::Row row = *it;
                cout << count << "t" << row[0] << endl;
                ++count;
            }
        } catch (const mysqlpp::BadQuery& bq) {
            cerr << "query error: " << bq.what() << endl;
            return -1;
        }
        cout << "nmake database fly away now by pressing a key>" << endl;
        getchar();
        try {
            mysqlpp::Query query = conn.query();
            mysqlpp::String sql("select count(*) as total from person");
            query << sql;
            mysqlpp::StoreQueryResult res = query.store();
            cout << "has " << (*res.begin())[0] << " rows" << endl;
        } catch (mysqlpp::BadQuery& e) {
            cerr << "n bad query 2>" << e.what() << endl;
            cout << "nmake database fly back now by pressing enter>" << endl;
            while (!conn.ping()) {
                //sleep(1);
                cout << "nwaiting for database to fly back>" << endl;
            }
            if (!conn.select_db(DBS)) {
                cerr << "nfailed to reconnect" << endl;
            }
        }
        try {
            mysqlpp::Query query = conn.query();
            //this is how my relation and its attributes looks like
            String sql("insert into person(firstname,lastname,gender,love,angry,"
            "forgiving) values('joy57/qxx','crimson','male','high','medium','high');");
            query << sql;
            query.execute();
            cerr << "n **inserted successfully**n" << endl;
        } catch (mysqlpp::BadQuery& e) {
            cerr << "bad query 3>" << e.what() << e.errnum() << endl;
            return -1;
        }
        cerr << "Jesus helps me when i stumble and fall" << endl;
        return 0;
    }