Client/¼½ºÆêÆ/log/ÈÕÖ¾_¼½ºÆêÆ_1107.docBinary files differ
Client/ËÎê»i/log/ÈÕÖ¾_ËÎê»i_1106.docBinary files differ
Client/Ö캽/log/Ö캽1105.docBinary files differ
Client/ÀîÏüÔö/log/ÀúÊ·²éѯ_ÀîÏüÔö_1104.docBinary files differ
Client/ÀîÏüÔö/log/ÀúÊ·²éѯ_ÀîÏüÔö_1105.docBinary files differ
Client/ÍõöÎöÎ/log/ÈÕÖ¾_ÍõöÎöÎ_1106.docBinary files differ
Client/Éê@/log/ÈÕÖ¾_Éê@_1106.docBinary files differ
Client/Ö£¿ÎÄ/log/Ö£¿ÎÄ1106.docBinary files differ
Client/ÀèºëÁØ/log/É豸¹ÜÀí_ÀèºëÁØ_1106.docBinary files differ
Client/¹¨ÆôÏé/log/ÈÕ־ģ°å_¹¨ÆôÏé_1106.docBinary files differ
Server/ÍõçûÔª/code/ConnectionPool.cpp
@@ -1,125 +1,101 @@ #include "stdafx.h" #include "ConnectionPool.h" #include <fstream> #include <iostream> #include <thread> ConnectionPool* ConnectionPool::getInstance() { static ConnectionPool connPool; return &connPool; } ConnectionPool::ConnectionPool() { // å è½½é ç½®æä»¶ if (!parseJsonFile()) { std::cout << "parseJsonFile is failed!" << std::endl; return; } for ( int i = 0 ; i < m_min_conn ; i++ ) { addConnection( ); } // å建ä¸ä¸ªçº¿ç¨ï¼å¯¹è¿æ¥æ°è¿è¡çæ§ ï¼è¿æ¥æ°ä¸è¶³å°±åç»§ç»å建 std::thread producer(&ConnectionPool::produce, this); // å¯¹è¿æ¥æ°è¿è¡çæ§ ï¼å¦ææå¤ªå¤ç©ºé²å¾çº¿ç¨ ï¼é£ä¹å°±å¯¹å ¶è¿è¡éæ¯ std::thread recycler( &ConnectionPool::recycle, this); // 线ç¨å离 producer.detach(); recycler.detach(); m_min_conn = 5; // å设æå°è¿æ¥æ°ä¸º 5 m_max_conn = 10; // å设æå¤§è¿æ¥æ°ä¸º 10 m_timeout = 1000; // åè®¾è¿æ¥è¶ æ¶æ¶é´ä¸º 1000 æ¯«ç§ max_del_time = 60000; // å设æå¤§ç©ºé²æ¶é´ä¸º 60000 æ¯«ç§ for (int i = 0; i < m_min_conn; i++) { addConnection(); } // å建ä¸ä¸ªçº¿ç¨ï¼å¯¹è¿æ¥æ°è¿è¡çæ§ ï¼è¿æ¥æ°ä¸è¶³å°±åç»§ç»å建 thread producer(&ConnectionPool::produce, this); // å¯¹è¿æ¥æ°è¿è¡çæ§ ï¼å¦ææå¤ªå¤ç©ºé²å¾çº¿ç¨ ï¼é£ä¹å°±å¯¹å ¶è¿è¡éæ¯ thread recycler(&ConnectionPool::recycle, this); // 线ç¨å离 producer.detach(); recycler.detach(); } bool ConnectionPool::parseJsonFile() { /*std::ifstream ifs("dbconf.json"); Reader rd; Value root; rd.parse(ifs, root); if ( root.isObject( ) ) { m_ip = root["ip"].asString(); m_port = root["port"].asInt(); m_userName = root["userName"].asString(); m_passwd = root["password"].asString(); m_db = root["dbName"].asString(); m_min_conn = root["minSize"].asInt(); m_max_conn = root["maxSize"].asInt(); max_del_time = root["maxDleTime"].asInt(); m_timeout = root["timeout"].asInt(); return true; }*/ return false; } void ConnectionPool::description() { std::cout << m_ip << ". " << m_userName << ". " << m_passwd << ". " << m_db << ". " << m_port << ". " << m_max_conn << ". " << m_min_conn << ". " << m_timeout << ". " << max_del_time << std::endl; } ConnectionPool::~ConnectionPool() { while (!m_connkQueue.empty()) { MysqlConn* conn = m_connkQueue.front(); m_connkQueue.pop(); delete conn; } while (!m_connkQueue.empty()) { MysqlConn* conn = m_connkQueue.front(); m_connkQueue.pop(); delete conn; } } void ConnectionPool::addConnection() { MysqlConn* conn = new MysqlConn(); if ( !conn->connect( m_ip, m_userName, m_passwd, m_db, m_port ) ) { std::cout << "ConnectionPool connect to mysql is failed!" << std::endl; delete conn; return; } conn->refreshActiveTime( ); m_connkQueue.push(conn); m_cond.notify_one(); // å¤éä¸ä¸ªçº¿ç¨ MysqlConn* conn = new MysqlConn(); if (!conn->isConnected()) { cout << "ConnectionPool connect to mysql is failed!" << endl; delete conn; return; } conn->refreshActiveTime(); m_connkQueue.push(conn); m_cond.notify_one(); // å¤éä¸ä¸ªçº¿ç¨ } void ConnectionPool::produce(){ while (true) { std::unique_lock<std::mutex> lock(m_mutex); while (m_connkQueue.size() >= m_min_conn) { // è¿æ¥éåçæ°éå¤§äºæå°çè¿æ¥æ° m_cond.wait(lock); } addConnection(); } void ConnectionPool::produce() { while (true) { unique_lock<mutex> lock(m_mutex); while (m_connkQueue.size() >= m_min_conn) { // è¿æ¥éåçæ°éå¤§äºæå°çè¿æ¥æ° m_cond.wait(lock); } addConnection(); } } // å é¤ç©ºé²è¿æ¥ void ConnectionPool::recycle() { while ( true ) { std::this_thread::sleep_for( std::chrono::milliseconds(500)); // ä¼ç 500 ms std::unique_lock<std::mutex>lock(m_mutex); while ( m_connkQueue.size() > m_min_conn ) { MysqlConn* conn = m_connkQueue.front( ); if (conn->getActiveTime() >= max_del_time) { m_connkQueue.pop(); delete conn; } else { break; } } } while (true) { this_thread::sleep_for(chrono::milliseconds(500)); // ä¼ç 500 ms unique_lock<mutex> lock(m_mutex); while (m_connkQueue.size() > m_min_conn) { MysqlConn* conn = m_connkQueue.front(); if (conn->getActiveTime() >= max_del_time) { m_connkQueue.pop(); delete conn; } else { break; } } } } std::shared_ptr<MysqlConn> ConnectionPool::getMysqlConn() { std::unique_lock<std::mutex>lock(m_mutex); while ( m_connkQueue.empty()) { // 妿çå¾ ä¸æ®µæ¶é´å,éåè¿æ¯ä¸ºç©º,è¿åä¸ä¸ª null if ( std::cv_status::timeout == m_cond.wait_for(lock, std::chrono::milliseconds(m_timeout)) ) { if( m_connkQueue.empty( ) ) return nullptr; } } std::shared_ptr<MysqlConn> connPtr(std::move(m_connkQueue.front()), [this](MysqlConn* conn) { std::unique_lock <std::mutex>lock(m_mutex) ; conn->refreshActiveTime(); m_connkQueue.push(conn); }); m_connkQueue.pop(); m_cond.notify_one(); // å¤éé»å¡çç产è 线ç¨,å¼å§ç产 return connPtr; shared_ptr<MysqlConn> ConnectionPool::getMysqlConn() { unique_lock<mutex> lock(m_mutex); while (m_connkQueue.empty()) { // 妿çå¾ ä¸æ®µæ¶é´å,éåè¿æ¯ä¸ºç©º,è¿åä¸ä¸ª null if (cv_status::timeout == m_cond.wait_for(lock, chrono::milliseconds(m_timeout))) { if (m_connkQueue.empty()) return nullptr; } } shared_ptr<MysqlConn> connPtr(move(m_connkQueue.front()), [this](MysqlConn* conn) { unique_lock<mutex> lock(m_mutex); conn->refreshActiveTime(); m_connkQueue.push(conn); }); m_connkQueue.pop(); m_cond.notify_one(); // å¤éé»å¡çç产è 线ç¨,å¼å§ç产 return connPtr; } void ConnectionPool::description() { cout << m_ip << ". " << m_userName << ". " << m_passwd << ". " << m_db << ". " << m_port << ". " << m_max_conn << ". " << m_min_conn << ". " << m_timeout << ". " << max_del_time << endl; } ConnectionPool* ConnectionPool::getInstance() { static ConnectionPool connPool; return &connPool; } Server/ÍõçûÔª/code/ConnectionPool.h
@@ -1,50 +1,44 @@ #pragma once #include <queue> #include <mutex> #include <condition_variable> //#include <json/json.h> #include "MysqlConn.h" //using namespace Json; class ConnectionPool { public: static ConnectionPool* getInstance( ); static ConnectionPool* getInstance(); std::shared_ptr<MysqlConn> getMysqlConn(); // 仿°æ®åºè¿æ¥æ± è·åè¿æ¥ shared_ptr<MysqlConn> getMysqlConn(); // 仿°æ®åºè¿æ¥æ± è·åè¿æ¥ ConnectionPool(const ConnectionPool& other) = delete; ConnectionPool& operator = (const ConnectionPool & other ) = delete; ~ConnectionPool(); ConnectionPool(const ConnectionPool& other) = delete; ConnectionPool& operator=(const ConnectionPool& other) = delete; void description(); ~ConnectionPool(); void description(); protected: ConnectionPool( ); // æé 彿° ConnectionPool(); // æé 彿° private: bool parseJsonFile(); // è§£æé ç½® // ä¸åéè¦è§£æé ç½®æä»¶ç彿° // bool parseJsonFile(); // è§£æé ç½® void produce(); void recycle(); void addConnection(); // å¢å è¿æ¥æ° void produce(); void recycle(); void addConnection(); // å¢å è¿æ¥æ° std::string m_ip; std::string m_userName; std::string m_passwd; std::string m_db; unsigned short m_port; // åæ»çæ°æ®åºè¿æ¥åæ° string m_ip = "127.0.0.1"; string m_userName = "root"; string m_passwd = "123456"; string m_db = "mayi_kunlun"; unsigned short m_port = 3306; int m_max_conn; int m_min_conn; int m_max_conn; int m_min_conn; int m_timeout; // è¿æ¥è¶ æ¶æ¶é´ int max_del_time; // æå¤§å 餿¶é´( è¿æ¥ç©ºé²æ¶é´è¶ è¿è¿ä¸ª,å°±ç»å½åè¿æ¥å ³é ) std::queue<MysqlConn*>m_connkQueue ; // è¿æ¥éå std::mutex m_mutex; // äºæ¥é std::condition_variable m_cond; // æ¡ä»¶åé int m_timeout; // è¿æ¥è¶ æ¶æ¶é´ int max_del_time; // æå¤§å 餿¶é´( è¿æ¥ç©ºé²æ¶é´è¶ è¿è¿ä¸ª,å°±ç»å½åè¿æ¥å ³é ) queue<MysqlConn*> m_connkQueue; // è¿æ¥éå mutex m_mutex; // äºæ¥é condition_variable m_cond; // æ¡ä»¶åé }; Server/ÍõçûÔª/code/MysqlConn.cpp
@@ -1,37 +1,60 @@ #include "stdafx.h" #include "MysqlConn.h" #include <regex> // åå§åè¿æ¥ // åå§åè¿æ¥ MysqlConn::MysqlConn() { mysql_ = mysql_init(mysql_); // 设置å符é if (mysql_) mysql_set_character_set(mysql_, "gbk"); } // è¿æ¥æ°æ®åº bool MysqlConn::connect(std::string ip, std::string userName, std::string passwd, std::string db, int port) { mysql_ = mysql_real_connect(mysql_, ip.c_str(), userName.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0); if (!mysql_) { return false; m_mysql = mysql_init(nullptr); if (!m_mysql) { cout << "Failed to initialize MySQL." << endl; return; } return true; // 设置å符é if (m_mysql) mysql_set_character_set(m_mysql, "gbk"); // 使ç¨åæ»çåæ°è¿æ¥æ°æ®åº m_mysql = mysql_real_connect(m_mysql, "127.0.0.1", "root", "123456", "mayi_kunlun", 3306, nullptr, 0); if (!m_mysql) { cout << "MysqlConn connect to mysql is failed!" << endl; // ç¡®ä¿å¨è¿æ¥å¤±è´¥æ¶æ£ç¡®æ¸ çèµæº mysql_close(m_mysql); m_mysql = nullptr; } // åå§å row_ å res_ m_row = nullptr; m_res = nullptr; } bool MysqlConn::isConnected() { return m_mysql != nullptr; } // è¿æ¥æ°æ®åº //bool MysqlConn::connect() { // string ip = "127.0.0.1"; // string userName = "root"; // string passwd = "123456"; // string db = "mayi_kunlun"; // int port = 3306; // m_mysql = mysql_real_connect(mysql_, ip.c_str(), userName.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0); // if (!m_mysql) { // return false; // } // return true; //} // éæ¾èµæº MysqlConn::~MysqlConn() { if (mysql_) { mysql_close(mysql_); mysql_ = nullptr; if (m_mysql) { mysql_close(m_mysql); m_mysql = nullptr; } freeRes(); } // æ´æ°æ°æ® bool MysqlConn::update(std::string sql) { bool MysqlConn::update(string sql) { // åæ°åæ¥è¯¢ä¼ååçå®å ¨æ£æ¥ MYSQL_STMT* stmt = mysql_stmt_init(mysql_); MYSQL_STMT* stmt = mysql_stmt_init(m_mysql); if (!stmt) { return false; } @@ -53,11 +76,36 @@ return true; } bool MysqlConn::query(string sql, vector<vector<string>>& result) { freeRes(); int ret = mysql_query(m_mysql, sql.c_str()); if (ret != 0) { fprintf(stderr, "Query failed: %s\n", mysql_error(m_mysql)); return false; } // è·åæ¥è¯¢ç»æ m_res = mysql_store_result(m_mysql); if (!m_res) return false; //å°ç»æé转å°äºç»´æ°ç»resultéé¢ //int col_cnt = m_mysql->field_count; int col_cnt = mysql_field_count(m_mysql); cout << col_cnt << endl; while (m_row = mysql_fetch_row(m_res)) { vector<string> tmp; for (int i = 0; i < col_cnt; i++) { tmp.push_back(m_row[i]); } result.push_back(tmp); } return true; } // æ¥è¯¢æ°æ®åº bool MysqlConn::query(std::string sql) { bool MysqlConn::query(string sql) { freeRes(); // åæ°åæ¥è¯¢ä¼ååçå®å ¨æ£æ¥ MYSQL_STMT* stmt = mysql_stmt_init(mysql_); MYSQL_STMT* stmt = mysql_stmt_init(m_mysql); if (!stmt) { return false; } @@ -75,8 +123,8 @@ mysql_stmt_close(stmt); return false; } res_ = mysql_stmt_result_metadata(stmt); if (!res_) { m_res = mysql_stmt_result_metadata(stmt); if (!m_row) { mysql_stmt_close(stmt); return false; } @@ -86,59 +134,60 @@ // å¾å°ç»æé bool MysqlConn::getResult() { if (res_) { row_ = mysql_fetch_row(res_); if (row_) return true; if (m_row) { m_row = mysql_fetch_row(m_res); if (m_row) return true; } return false; } // è·åç»æéçåæ®µ std::string MysqlConn::getField(int index) { int cols = mysql_num_fields(res_); if (index >= cols || index < 0) return std::string(""); string MysqlConn::getField(int index) { int cols = mysql_num_fields(m_res); if (!m_res || index >= cols || index < 0) return string(""); char* value = row_[index]; unsigned long len = mysql_fetch_lengths(res_)[index]; return std::string(value, len); char* value = m_row[index]; // ä½¿ç¨æ¾å¼ç±»åè½¬æ¢ unsigned long len = static_cast<unsigned long>(mysql_fetch_lengths(m_res)[index]); return string(value, len); } // äºå¡æä½ bool MysqlConn::transaction() { return mysql_autocommit(mysql_, false); return mysql_autocommit(m_mysql, false); } // æäº¤äºå¡ bool MysqlConn::commit() { return mysql_commit(mysql_); return mysql_commit(m_mysql); } // äºå¡åæ» bool MysqlConn::rollback() { return mysql_rollback(mysql_); return mysql_rollback(m_mysql); } void MysqlConn::refreshActiveTime() { activeTime_ = std::chrono::steady_clock::now(); m_activeTime = chrono::steady_clock::now(); } long long MysqlConn::getActiveTime() { // 纳米 std::chrono::nanoseconds nased = std::chrono::steady_clock::now() - activeTime_; chrono::nanoseconds nased = chrono::steady_clock::now() - m_activeTime; // è½¬æ¢ææ¯«ç±³ std::chrono::microseconds millsed = std::chrono::duration_cast<std::chrono::microseconds>(nased); chrono::microseconds millsed = chrono::duration_cast<chrono::microseconds>(nased); return millsed.count(); // å¤å°æ¯«ç§ } // å®å ¨æ ¡éªå®ç°ï¼è¿éç®åä½¿ç¨æ£å表达å¼å¤ææ¯å¦å å«å±é©å符 bool MysqlConn::isSqlSafe(const std::string& sql) { std::regex dangerousPattern(".*(['\";\\-+=]).*"); return!std::regex_search(sql, dangerousPattern); bool MysqlConn::isSqlSafe(const string& sql) { regex dangerousPattern(".*(['\";\\-+=]).*"); return!regex_search(sql, dangerousPattern); } void MysqlConn::freeRes() { if (res_) { mysql_free_result(res_); res_ = nullptr; if (m_res) { mysql_free_result(m_res); m_res = nullptr; } } Server/ÍõçûÔª/code/MysqlConn.h
@@ -2,48 +2,53 @@ #include <string> #include <WinSock2.h> //#include <mysql.h> #include "MySQL/include/mysql.h" #include <string.h> #include <chrono> #include <iostream> #include <memory> #include <queue> #include <mutex> #include <condition_variable> #include <regex> #pragma comment(lib,"./MySQL/lib/libmysql.lib") using namespace std; class MysqlConn { public: // åå§åè¿æ¥ MysqlConn(); // è¿æ¥æ°æ®åº bool connect(std::string ip, std::string userName, std::string passwd, std::string db , int port = 3306); //bool connect(); // éæ¾èµæº ~MysqlConn( ); ~MysqlConn(); // æ´æ°æ°æ®åº ( insert update delete ) bool update(std::string sql); bool update(string sql); // æ¥è¯¢æ°æ®åº bool query(std::string sql); bool query(string sql, vector<vector<string>>& result); bool query(string sql); // å¾å°ç»æé bool getResult(); // è·åç»æéçåæ®µ std::string getField(int index); string getField(int index); // äºå¡æä½ bool transaction(); // æäº¤äºå¡ bool commit( ); bool commit(); // äºå¡åæ» bool rollback(); void refreshActiveTime( ); // å·æ°æ´»è·æ¶é´ void refreshActiveTime(); // å·æ°æ´»è·æ¶é´ long long getActiveTime(); // è·åå½åæ´»è·çæ¶é´é´é // å®å ¨æ ¡éªæ¥å£ bool isSqlSafe(const std::string& sql); private: bool isSqlSafe(const string& sql); bool isConnected(); protected: void freeRes(); MYSQL* mysql_ = NULL ; MYSQL_RES* res_ = NULL; MYSQL_ROW row_ = nullptr; std::chrono::steady_clock::time_point activeTime_; MYSQL* m_mysql; MYSQL_RES* m_res; MYSQL_ROW m_row; chrono::steady_clock::time_point m_activeTime; }; Server/ÍõçûÔª/log/ÈÕ־ģ°å_ÍõçûÔª_1101.docBinary files differ
Server/ÍõçûÔª/log/ÈÕ־ģ°å_ÍõçûÔª_1103 .docBinary files differ
Server/ÍõçûÔª/log/ÈÕ־ģ°å_ÍõçûÔª_1104.docBinary files differ
Server/ÍõçûÔª/log/ÈÕ־ģ°å_ÍõçûÔª_1105.docBinary files differ
Server/ÂíÓ庼/log/20241106À¥ÂØÈÕ±¨.docBinary files differ
Server/ÂíÓ庼/log/ÈÕÖ¾_ÂíÓ庼_20241106.docBinary files differ
kunlun.sql
@@ -211,4 +211,8 @@ /*!40014 SET FOREIGN_KEY_CHECKS=IFNULL(@OLD_FOREIGN_KEY_CHECKS, 1) */; /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; /*!40111 SET SQL_NOTES=IFNULL(@OLD_SQL_NOTES, 1) */; z <<<<<<< HEAD z ======= SELECT id,devices_name,longitude,latitude,devices_status FROM devices_management; >>>>>>> 2e420a0a40cc3fcc62bcb42ee6a25f4ad4f22dd3