用c++寫一個(gè)數(shù)據(jù)庫(kù)連接池
創(chuàng)新互聯(lián)是專業(yè)的高密網(wǎng)站建設(shè)公司,高密接單;提供成都網(wǎng)站制作、成都網(wǎng)站建設(shè),網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行高密網(wǎng)站開發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!數(shù)據(jù)庫(kù)連接池是為了提高數(shù)據(jù)庫(kù)連接的性能,進(jìn)行連接復(fù)用
對(duì)于復(fù)雜數(shù)據(jù)庫(kù)進(jìn)行大量引用的場(chǎng)景下就會(huì)出現(xiàn)訪問(wèn)瓶頸
常見的兩種解決方法就是:為了減少磁盤 I/O的次數(shù),在數(shù)據(jù)庫(kù)和服務(wù)器的應(yīng)用中間加一層 緩存數(shù)據(jù)庫(kù)(例如:Redis、Memcache);
或者就是增加連接池,來(lái)減少高并發(fā)情況下大量 TCP三次握手、MySQL Server連接認(rèn)證、MySQL Server關(guān)閉連接回收資源和TCP四次揮手 所耗費(fèi)的性能。
機(jī)制解讀:連接池呢就是為數(shù)據(jù)庫(kù)連接建立一個(gè)緩沖池。
1:從連接池獲取或創(chuàng)建可用連接
2:使用完畢之后,把連接返回給連接池
3:在系統(tǒng)關(guān)閉前,斷開所有連接并釋放連接占用的系統(tǒng)資源
4:能夠處理無(wú)效連接,限制連接池中的連接總數(shù)不低于或者不超過(guò)某個(gè)限定值
池子里四個(gè)基本屬性:
初始連接量(init_size): 表示連接池事先會(huì)和MySQL服務(wù)器創(chuàng)建init_size個(gè)connection連接,當(dāng)應(yīng)用發(fā)起MySQL訪問(wèn)時(shí),不用再創(chuàng)建和MySQL服務(wù)器新的連接,直接從連接池中獲取一個(gè)可用的連接就可以,使用完成后,并不去釋放connection,而是把當(dāng)前connection再歸還到連接池當(dāng)中。
大連接(max_size): 當(dāng)并發(fā)訪問(wèn)MySQL服務(wù)器的請(qǐng)求增多時(shí),初始連接量已經(jīng)不夠使用了,此時(shí)會(huì)根據(jù)新的請(qǐng)求數(shù)量去創(chuàng)建更多的連接給應(yīng)用去使用,但是新創(chuàng)建的連接數(shù)量上限是max_size,不能無(wú)限制的創(chuàng)建連接。因?yàn)槊總€(gè)連接都會(huì)占用一個(gè)socket資源,一般連接池和服務(wù)器程序是部署在一臺(tái)主機(jī)上的,如果連接池占用過(guò)多的socket資源,那么服務(wù)器就不能接收更多的客戶端請(qǐng)求了。當(dāng)這些連接使用完成后,再次歸還到連接池當(dāng)中來(lái)維護(hù)。
大空閑時(shí)間(max_idle_time): 當(dāng)訪問(wèn)MySQL的并發(fā)請(qǐng)求多了以后,連接池里面的連接數(shù)量會(huì)動(dòng)態(tài)增加,上限是max_size個(gè),當(dāng)這些連接用完再次歸還到連接池當(dāng)中。如果在指定的max_idle_time里面,這些新增加的連接都沒(méi)有被再次使用過(guò),那么新增加的這些連接資源就要被回收,只需要保持初始連接量init_size個(gè)連接就可以了。
連接超時(shí)時(shí)間(connection_timeout): 當(dāng)MySQL的并發(fā)請(qǐng)求量過(guò)大,連接池中的連接數(shù)量已經(jīng)到達(dá)max_size了,而此時(shí)沒(méi)有空閑的連接可供使用,那么此時(shí)應(yīng)用無(wú)法從連接池獲取連接,它通過(guò)阻塞的方式等待獲取連接的時(shí)間如果超過(guò)connection_timeout時(shí)間,那么連接失敗,無(wú)法訪問(wèn)數(shù)據(jù)庫(kù)。
技術(shù)點(diǎn)的分析:通過(guò)預(yù)先創(chuàng)建一定數(shù)量的連接,放到一個(gè)池子。當(dāng)客戶端有請(qǐng)求時(shí),服務(wù)器端需要與mysql進(jìn)行交互,那么只需要從池子里取出一個(gè)連接,當(dāng)操作完成再將連接放到連接池中。如此以來(lái)避免了頻繁的創(chuàng)建和銷毀線程。
1.池子只需要一個(gè)就夠用了,一個(gè)池子里有很多連接了。所以對(duì)于線程池這個(gè)類而言使用單例模式最為合適。用c++11內(nèi)部靜態(tài)變量這種線程安全的方法做的
2.池子里面連接存在類似隊(duì)列這種容器里面,直接用queue了,每次新的連接從隊(duì)尾進(jìn)去,隊(duì)頭的連接用完之后,如果空閑太久,占資源就需要把他銷毀掉
3.進(jìn)行數(shù)據(jù)庫(kù)連接的話需要mysql相關(guān)的api,用c++的話,就把這些api封裝一下,具體常用的api之前有寫過(guò)一篇博客?C/C++鏈接mysql_
這封裝成一個(gè)數(shù)據(jù)庫(kù)連接類,里面就是伴隨著數(shù)據(jù)庫(kù)的初始化,查詢,更新,事務(wù)的一系列操作。連接池里面隊(duì)列放的就是這一個(gè)個(gè)數(shù)據(jù)庫(kù)連接的類對(duì)象
4.需要訪問(wèn)數(shù)據(jù)庫(kù)的線程從連接池里面取出連接,和給池子里添加新連接的線程構(gòu)成了一個(gè)典型的生產(chǎn)者消費(fèi)者,用條件變量加+互斥鎖保證同步,cas原子操作 定義一個(gè)連接池內(nèi)的連接數(shù)量,用來(lái)當(dāng)做我們生產(chǎn)和消費(fèi)線程工作都要參考的變量,變量必須保證其原子性
5.對(duì)于獲取連接池中的連接來(lái)說(shuō),用戶只需要關(guān)心使用,去連接池里直接獲取連接并且使用即可,并不用關(guān)心連接的生成和銷毀,并且,對(duì)于使用完的連接來(lái)說(shuō),為了達(dá)到復(fù)用的目的,我們并不希望把它釋放掉,而是使用完之后將其放回到連接池中供其他消費(fèi)者使用,這個(gè)我們就可以使用智能指針來(lái)完成用lambda表達(dá)式定制連接釋放的功能,(把連接重新還給池子);重新放進(jìn)連接池呢就是重新push到隊(duì)列池子里,不過(guò)要更新一下時(shí)間戳,記錄每個(gè)連接的存活時(shí)間
6.連接池實(shí)現(xiàn)自動(dòng)管理連接數(shù)(不夠時(shí)創(chuàng)建連接,銷毀空閑時(shí)間較長(zhǎng)的連接)
需要通過(guò)兩個(gè)子線程,因?yàn)橹骶€程不能阻塞在這個(gè)地方,所以通過(guò)兩個(gè)子線程取完成,設(shè)置線程分離
一個(gè)子線程用來(lái)不夠時(shí)自動(dòng)創(chuàng)建連接:
? 線程池維護(hù)了兩個(gè)數(shù)據(jù),一個(gè)最小連接數(shù),一個(gè)大連接數(shù)
一個(gè)子線程用來(lái)銷毀空閑時(shí)間較長(zhǎng)的連接:
? 大概實(shí)現(xiàn)思路:從隊(duì)頭取出連接,并將該連接的空閑時(shí)長(zhǎng)與設(shè)定的大空閑時(shí)長(zhǎng)比較,如果大于等于就從隊(duì)列中彈出并銷毀
7.利用Jsoncpp庫(kù)去解析json文件,配置環(huán)境
整個(gè)流程原理大概就這樣
當(dāng)時(shí)做了四組壓力測(cè)試:
一個(gè)線程去連接數(shù)據(jù)庫(kù)每次插一條數(shù)據(jù),測(cè)試5000下
用連接池省了和數(shù)據(jù)庫(kù)建立連接的損耗?
多線程的話,測(cè)了五個(gè)線程(好比五個(gè)用戶)不斷的去同時(shí)連接數(shù)據(jù)庫(kù),每次連接插入一條數(shù)據(jù),一共插5000條
接上連接池,效率更高
測(cè)了5000條數(shù)據(jù),能很明顯的看到單線程多線程下使用連接池,訪問(wèn)速度有著明顯的提高
總結(jié):深入了解了池化的技術(shù),可以和線程池配套,作為一個(gè)不錯(cuò)的項(xiàng)目
源碼放在這了:Xw-oorik
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧