MySQL非同期APIリクエスト(libmysqlclient)

現在、私はMySQL接続のスケジューラに取り組んでいることがわかりました。 そしてここで最近、ドキュメント/ブログなどを掘り下げなければなりませんでした。 そのため、APIとlibmysqlclientライブラリを使用して、C ++でMySQLサーバーへの非同期リクエストを実装する方法をコミュニティと共有することにしました。







MySQL APIを使用してプログラミングを開始するには、mysql.hヘッダーファイルが必要です。

また、libmysqlclientライブラリー。 debのようなOSの場合、これはすべて次のように配置できます。

sudo apt-get install libmysqlclient-dev libmysqlclient
      
      







コンパイラーに次のことを示します。

-L /パス/ to / mysqliclientlib / -lmysqlclient



Qt Creatorでコードを作成する場合、プロジェクトファイルに次のコードを追加できます(別のパスがある場合があります)。

LIBS + = -L / usr / lib / mysql -lmysqlclient



C ++でMySQLを使用するための準備はほぼすべて整っています。

定義:非同期クエリ-スレッドを使用しない、データベースへの複数の並列クエリ。 mysql_real_query関数を使用して、これを達成することはできません。 プログラムは、サーバーからの結果(応答)を待ちます。



特に、私はlibeventライブラリを使用してイベントをキャッチします。 次のように配置できます。

 sudo apt-get install libevent-dev libevent
      
      







コンパイラーに次のことを伝えます。

LIBS + = -L / usr / lib / mysql -lmysqlclient -L / usr / lib / -levent

ヘッダーファイル:

#include <event.h>



すべて、すべて準備ができています。 降りる。 そこで、リクエストを非同期的に送信するクラスを作成します。 このクラスには、私のためのメソッドも含まれています。トピックに関連するものにのみ焦点を当てます。



 class CBalanceMySQL { private: //    //    unsigned int thread_count; //    std::vector<MYSQL*> v; //  std::vector<event*> events; //  std::vector<std::string> queries; struct event_base *evbase; //   ,      //     pFunc p_func; //      void run(); public: // constructor CBalanceMySQL(); // destructor ~CBalanceMySQL(); //      //     void setThreadCount(int); //    bool ConnectAllThreads(); //        bool setSuccessFunc(void(*)(int, short, void*)); };
      
      







クラスコンストラクター(または他の場所)で、イベントベースを初期化します。

 this->evbase = event_base_new();
      
      







次に、サーバーとの接続を確立し、それらを「記憶」する必要があります。 指定された数の要求に対してサイクルを実行し、接続をベクトルvに保存します。

 bool CBalanceMySQL::ConnectAllThreads() { for (uint i = 0; i < this->thread_count; i++) { MYSQL *m; m = mysql_init(NULL); if (!mysql_real_connect(m, this->host, this->user, this->password, NULL, this->port, NULL, 0)) { std::cout << mysql_error(m); return 0; } else { this->v.push_back(m); } } return 1; }
      
      







これらの接続に必要な要求を満たすことは引き続きあります。

 void CBalanceMySQL::run() { for (uint i = 0; i < this->v.size(); i++) { //  struct event *ev; //     std::string q = this->queries.at(i); //    MYSQL *m = this->v.at(i); //   mysql_send_query(m, q.c_str() , strlen(q.c_str())); ev = new event; //   //   -      p_func event_set(ev, m->net.fd, EV_READ, this->p_func, m); event_base_set(this->evbase, ev); event_add(ev, NULL); events.push_back(ev); } //         while (0 == event_base_loop(this->evbase, 0)); }
      
      







それがほとんどすべてです。 自分で掃除する必要があります:



 for (uint i = 0; i < v.size(); i++) { mysql_close(this->v.at(i)); } for (uint i = 0; i < events.size(); i++) { delete(this->events.at(i)); } event_base_free(this->evbase);
      
      







最後の1つは、リクエストの結果を処理する機能です。 形式は次のとおりです。



 static void read_result(int fd, short event, void *_userdata) { MYSQL *m = (MYSQL*)_userdata; if (0 == mysql_read_query_result(m)) { MYSQL_RES *res = mysql_store_result(m); MYSQL_ROW row = mysql_fetch_row(res); //     SELECT COUNT(*) FROM information_schema.processlist,      cout << "cnt for net.fd = " << fd << " is " << row[0] << endl; mysql_free_result(res); } }
      
      







それだけです 誰かが役に立つといいな。

PSはあまりキックしません-C ++では教祖ではありません。



All Articles