<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
高並行場景下, 頻繁建立, 銷燬連線帶來的效能損耗
三次握手,連線認證(身份許可權認證),MySQL資源釋放, 四次揮手
每一次client 存取 Mysql server都需要進行上述操作. 上述這些操作是固定的流程. 真正的sql語句執行操作才是我們無法逃脫的, 所以上述這些我們完全可以提前建立出來,然後進行不斷的複用connections. 實現mysql server存取的效能提升.
思考: 提前建立好的 connetions 數目是否是越多越好?
當然是不可能,因為每一個connection都是需要佔據一定的系統資源的, 建立過多的connection 會導致伺服器資源緊張. 起碼per connection per socketfd (通訊端資源)
思考: connections 數目設計?
上下限限制數目. initSize控制下限. maxSize控制連線上限 (一般是系統的最大mysql connetions num)
多餘connection最長閒置時間限制: maxIdleTime (及時釋放閒置連線)
資源緊張, 並行存取量高. 沒有連線可用 :connectionTimeout (return error, 獲取連線超時時間)
資料成員
MYSQL* _conn; //連線控制程式碼 clock_t _startTime; //連線起始空閒時間
操作介面
Connection(); //構造 init Connection ~Connection(); //解構 destroy connection bool connect(ip, port, username, password, dbname); //連線操作, 返回連線結果 bool update(sql); //表更新操作, 返回更新結果 MYSQL_RES* query(sql); //查詢操作, 返回查詢結果 void refreshStartTime(); //重新整理連線起始空閒時間 clock_t getAliveTime(); //獲取連線空閒時間
資料成員
//連線登入資訊 string _ip; unsigned short _port; string _username; string _password; string _dbname; //連線數量等設定資訊 int _initSize; int _maxSize; int _maxIdleTime; int _connectionTimeout; //連線儲存資訊,以及保證執行緒安全 queue<Connection*> _connectionQue; mutex _queueLock; condition_variable _cond; atomic_int _connectionCnt;
操作介面
ConnectionPool(); //構造 init pool, 載入設定, 初始連線, 啟動執行緒 static ConnectionPool* getConnectionPool();//獲取單例 shared_ptr<Connection> getConnection(); //獲取連線 int _loadConfigFile(string& filename); //載入解析設定資訊 void produceConnectionTask(); //生產連線任務 void scannerConnetionTask(); //掃描監視銷燬空閒執行緒任務
getConnection()
/* 從連線池中獲取一條連線. 相當於是消費者 消費前提, _connectionQue中有貨, 所以無貨期間需要進行阻塞休眠等待. 等待也不能一直等待. 存在連線超時時間, waittime >= _connectionTimeout then output << error. */ shared_ptr<Connection> getConnection() { unique_lock<mutex> auto_lock(_queueLock);//定義智慧鎖 while (_connectionQue.empty()) { if (cv_status::timeout == _cond.wait_for(auto_lock, chrono::milliseconds(_connectionTimeout))) { //達到連線超時時間 if (_connectionQue.empty()) { //LOG DEBUG INFO cerr << "獲取連線超時" << endl; return nullptr; } } } //定義shared_ptr<Connection> 自定義del函數, 而非直接呼叫~T() shared_ptr<Connection> sp(_connectionQue.front(), [&](Connection* pconn){ unique_lock<mutex> auto_lock(_queueLock); pconn->refreshStartTime(); //重新整理連線起始空閒時間 _connectionQue.push(pconn); }); _connectionQue.pop(); _cond.notify_all(); //彈出任務, queue maybe empty notify produce return sp; }
produceConnectionTask()
/* 生產者執行緒任務. 在_connectionQue中無connetion && _connectionCnt < _maxSize 時候 及時建立連線填充_connectionQue。 */ void produceConnectionTask() { for (;;) { unique_lock<mutex> auto_lock(_queueLock); while (!_connectionQue.empty()) { _cond.wait(auto_lock); } if (_connectionCnt < _maxSize) { Connection* pconn = new Connection(); pconn->connet(_ip, _port, _username, _password, _dbname); pconn->refreshStartTime(); _connectionQue.push(pconn); _connectionCnt++; } _cond.notify_all(); //通知消費 } }
scannerConnetionTask()
/* 不停的掃描所有的connection, 從頭到尾的掃描, 監控銷燬哪些長期空閒的connection, 避免對於空閒資源的無端佔用浪費. 每一次休眠一個 _maxIdleTime 就出來 檢查, 定期輪詢檢查空閒麗連線進行銷燬 */ void scannerConnectionTask() { for (;;) { //休眠maxIdleTime this_thread::sleep_for(chrono::seconds(_maxIdleTime)); unique_lock<mutex> auto_lock(_queueLock); while (_connectionCnt > _initSize) { Connection *p = _connectionQue.front(); if (p->getAliveeTime()/SECONDS_PER_SEC >= _maxIdleTime) { _connectionQue.pop(); _connectionCnt--; delete p; // 呼叫~Connection()釋放連線 } else { break; // 隊頭的連線沒有超過_maxIdleTime,其它連線肯定沒有 } } } }
到此這篇關於基於C++實現Mysql資料庫連線池範例的文章就介紹到這了,更多相關C++資料庫連線池內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45