MySQL рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдПрдкреАрдЖрдИ рдЕрдиреБрд░реЛрдз (libmysqlclient)

рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдЕрдм рдореИрдВ MySQL рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреБрд╕реВрдЪрдХ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдФрд░ рдпрд╣рд╛рдБ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдореБрдЭреЗ рдкреНрд░рд▓реЗрдЦрди / рдмреНрд▓реЙрдЧ рдЖрджрд┐ рдореЗрдВ рддрд▓реНрд▓реАрди рд╣реЛрдирд╛ рдкрдбрд╝рд╛ред рдФрд░ рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ API рдФрд░ libmysqlclient рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ C ++ рдореЗрдВ MySQL рд╕рд░реНрд╡рд░ рдкрд░ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рд╕рдореБрджрд╛рдп рдХреЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред



MySQL API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ mysql.h рд╣реИрдбрд░ рдлрд╝рд╛рдЗрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдФрд░ libmysqlclient рд▓рд╛рдЗрдмреНрд░реЗрд░реАред рдбреАрдм-рдЬреИрд╕реЗ OS рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╕рдм рдЗрд╕ рддрд░рд╣ рд╕реЗ рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
sudo apt-get install libmysqlclient-dev libmysqlclient 


рд╣рдо рд╕рдВрдХрд▓рдХ рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдВрдХреЗрдд рджреЗрддреЗ рд╣реИрдВ:
-L / path / to / mysqliclientlib / -lmysqlclient

рдпрджрд┐ рдЖрдк Qt рдХреНрд░рд┐рдПрдЯрд░ рдореЗрдВ рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ (рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдЕрд▓рдЧ рд░рд╛рд╕реНрддрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ):
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 / -рд╡реЗрдВрдЯ
рд╣реИрдбрд░ рдлрд╝рд╛рдЗрд▓:
# рдЬрд╛рд░реА рдХрд░реЗрдВ <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); 


рдФрд░ рдЕрдВрддрд┐рдо рдЕрдиреБрд░реЛрдз рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рд╣реИред рдЗрд╕рдХрд╛ рд░реВрдк рд╣реИ:

 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 ++ рдореЗрдВ рдЧреБрд░реБ рдирд╣реАрдВред

Source: https://habr.com/ru/post/In144918/


All Articles