全部課程
發(fā)布時間: 2023-07-24 16:30:15
池化技術(shù)能夠減少資源對象的創(chuàng)建次數(shù),提?程序的響應(yīng)性能,特別是在?并發(fā)下這種提?更加明顯。使用池化技術(shù)緩存的資源對象有如下共同特點:
1. 對象創(chuàng)建時間長;
2. 對象創(chuàng)建需要大量資源;
3. 對象創(chuàng)建后可被重復(fù)使用像常見的線程池、內(nèi)存池、連接池、對象池都具有以上的共同特點。
什么是數(shù)據(jù)庫連接池
定義:數(shù)據(jù)庫連接池(Connection pooling)是程序啟動時建立足夠的數(shù)據(jù)庫連接,并將這些連接組成一個連接池,由程序動態(tài)地對池中的連接進行申請,使用,釋放。
大白話:創(chuàng)建數(shù)據(jù)庫連接是?個很耗時的操作,也容易對數(shù)據(jù)庫造成安全隱患。所以,在程序初始化的時候,集中創(chuàng)建多個數(shù)據(jù)庫連接,并把他們集中管理,供程序使用,可以保證較快的數(shù)據(jù)庫讀寫速度,還更加安全可靠。這里講的數(shù)據(jù)庫,不單只是指Mysql,也同樣適用于Redis。
為什么使用數(shù)據(jù)庫連接池
1. 資源復(fù)用:由于數(shù)據(jù)庫連接得到復(fù)用,避免了頻繁的創(chuàng)建、釋放連接引起的性能開銷,在減少系統(tǒng)消耗的基礎(chǔ)上,另一方面也增進了系統(tǒng)運行環(huán)境的平穩(wěn)性(減少內(nèi)存碎片以及數(shù)據(jù)庫臨時進程/線程的數(shù)量)。
2. 更快的系統(tǒng)響應(yīng)速度:數(shù)據(jù)庫連接池在初始化過程中,往往已經(jīng)創(chuàng)建了若干數(shù)據(jù)庫連接置于池中備用。此時連接的初始化工作均已完成。對于業(yè)務(wù)請求處理而言,直接利用現(xiàn)有可用連接,避免了從數(shù)據(jù)庫連接初始化和釋放過程的開銷,從而縮減了系統(tǒng)整體響應(yīng)時間。
3. 統(tǒng)?的連接管理:避免數(shù)據(jù)庫連接泄露,在較為完備的數(shù)據(jù)庫連接池實現(xiàn)中,可根據(jù)預(yù)先的連接占用超時設(shè)定,強制收回被占用連接。從而避免了常規(guī)數(shù)據(jù)庫連接操作中可能出現(xiàn)的資源泄露。
如果不使用連接池
1. TCP建立連接的三次握手(客戶端與MySQL服務(wù)器的連接基于TCP協(xié)議)
2. MySQL認證的三次握手
3. 真正的SQL執(zhí)行
4. MySQL的關(guān)閉
5. TCP的四次握手關(guān)閉
可以看到,為了執(zhí)行?條SQL,需要進行TCP三次握手,Mysql認證、Mysql關(guān)閉、TCP四次揮手等其他操作,執(zhí)行SQL操作在所有的操作占比非常低。
?
優(yōu)點:實現(xiàn)簡單
缺點:
· 網(wǎng)絡(luò)IO較多
· 帶寬利用率低
· QPS較低
· 應(yīng)用頻繁低創(chuàng)建連接和關(guān)閉連接,導(dǎo)致臨時對象較多,帶來更多的內(nèi)存碎片
· 在關(guān)閉連接后,會出現(xiàn)大量TIME_WAIT 的TCP狀態(tài)(在2個MSL之后關(guān)閉)
長連接和連接池的區(qū)別
· 長連接是?些驅(qū)動、驅(qū)動框架、ORM工具的特性,由驅(qū)動來保持連接句柄的打開,以便后續(xù)的數(shù)據(jù)庫操作可以重用連接,從而減少數(shù)據(jù)庫的連接開銷。
· 而連接池是應(yīng)用服務(wù)器的組件,它可以通過參數(shù)來配置連接數(shù)、連接檢測、連接的生命周期等。
· 連接池內(nèi)的連接,其實就是長連接。
為什么要用內(nèi)存池:
1. 在需要堆內(nèi)存管理一些數(shù)據(jù)的時候直接malloc,容易造成內(nèi)存碎片
2. 在需要堆內(nèi)存管理一些數(shù)據(jù)的時候直接malloc,容易忘記free,造成內(nèi)存泄漏,利于內(nèi)存管理
異步請求要點:
1. 請求方作為客戶端請求后(send/sendto),把fd交給epoll管理,不等待結(jié)果返回(recv/recvfrom)。
2. epoll_wait在一個線程死循環(huán)中,當(dāng)epoll收到消息,在進行處理(recv/recvfrom)。