新聞中心
什么是連接池

在實(shí)際應(yīng)用開發(fā)中,一般會(huì)有很多訪問下游的需求(下游包括但不限于服務(wù)/數(shù)據(jù)庫/緩存),在并發(fā)量很低的時(shí)候,通常不會(huì)有任何問題的,但是當(dāng)服務(wù)單機(jī)QPS達(dá)到幾百、幾千、甚至上萬的時(shí)候,如果每一次訪問還是必須經(jīng)歷建立連接=》收發(fā)請(qǐng)求=》關(guān)閉連接=》釋放資源等步驟,系統(tǒng)的性能必然會(huì)急劇下降,甚至?xí)?dǎo)致系統(tǒng)崩潰。
連接池正是是解決這個(gè)問題最常用的方法,其思想非常簡單,即是在服務(wù)啟動(dòng)的時(shí)候,先建立好若干連接,當(dāng)有請(qǐng)求過來,就從中取出一個(gè),執(zhí)行下游操作,執(zhí)行完再放回,從而避免反復(fù)的建立和銷毀連接,以提升性能。
如何實(shí)現(xiàn)連接池
連接池是一個(gè)獨(dú)立的服務(wù),需要常駐進(jìn)程。一個(gè)完整的連接池操作,通常要經(jīng)歷如下幾步:
(1)建立連接池對(duì)象(服務(wù)啟動(dòng))。
(2)按照事先指定的參數(shù)創(chuàng)建初始數(shù)量的連接(即:空閑連接數(shù))。
(3)對(duì)于一個(gè)訪問請(qǐng)求,直接從連接池中得到一個(gè)連接。如果連接池對(duì)象中沒有空閑的連接,且連接數(shù)沒有達(dá)到最大(即:最大活躍連接數(shù)),創(chuàng)建一個(gè)新的連接;如果達(dá)到最大,則設(shè)定一定的超時(shí)時(shí)間,來獲取連接。
(4)運(yùn)用連接訪問服務(wù)。
(5)訪問服務(wù)完成,釋放連接(此時(shí)的釋放連接,并非真正關(guān)閉,而是將其放入空閑隊(duì)列中。如實(shí)際空閑連接數(shù)大于初始空閑連接數(shù)則釋放連接)。
(6)釋放連接池對(duì)象(服務(wù)停止、維護(hù)期間,釋放連接池對(duì)象,并釋放所有連接)。
Java對(duì)連接池比較友好,有著很多成熟的解決方案,如DBCP 、C3P0、Druid等。而PHP在這方面就相對(duì)較弱,雖然Mysql提供了長連接的API,但在PHP機(jī)器數(shù)量較多,規(guī)模較大的情況下,mysql_pconnect非但不能節(jié)約MySQL資源,反而會(huì)加劇數(shù)據(jù)庫的負(fù)荷。這主要是由于它需要依賴apache或fpm,比如,假設(shè)有100臺(tái)PHP的應(yīng)用服務(wù)器,每個(gè)機(jī)器需要啟動(dòng)100個(gè)apache或fpm工作進(jìn)程,每個(gè)進(jìn)程都會(huì)產(chǎn)生一個(gè)長連接到MySQL,這樣一共會(huì)產(chǎn)生1萬個(gè)My SQL連接。大家都知道,MySQL是每個(gè)連接會(huì)占用1個(gè)線程,如果有1萬個(gè)連接,那MYSQL就需要?jiǎng)?chuàng)建1萬個(gè)線程,這樣大量的系統(tǒng)資源會(huì)被浪費(fèi)在線程間上下文切換上。實(shí)際上,你的業(yè)務(wù)代碼中并不是所有地方都在做數(shù)據(jù)庫操作,所以,如果創(chuàng)建了這么多的連接,但是很多都是空閑的,那這樣就會(huì)很浪費(fèi)資源。
鑒于此,PHP要想獨(dú)立解決連接復(fù)用的問題,那必須實(shí)現(xiàn)自己的連接池。所幸,PHP擴(kuò)展swoole剛好可以做到這一點(diǎn),利用swoole提供的task功能可以很方便做出一個(gè)連接池來。
如下是使用swoole實(shí)現(xiàn)連接池的部分代碼:
通過這一段代碼,PHP就可以實(shí)現(xiàn)連接池,解決連接不可復(fù)用的問題。
當(dāng)然以上只是一個(gè)示例,要想在生產(chǎn)環(huán)境中使用,僅僅這樣肯定不夠。這里推薦一個(gè)現(xiàn)成的工具——SMProxy。
SMProxy是一個(gè)基于mysql協(xié)議,使用swoole 開發(fā)的mysql數(shù)據(jù)庫連接池。它有如下特色:
- 支持讀寫分離
- 支持?jǐn)?shù)據(jù)庫連接池,能夠有效解決 PHP 帶來的數(shù)據(jù)庫連接瓶頸
- 支持 SQL92 標(biāo)準(zhǔn)
- 采用協(xié)程調(diào)度
- 支持多個(gè)數(shù)據(jù)庫連接,多個(gè)數(shù)據(jù)庫,多個(gè)用戶,靈活搭配
- 遵守 MySQL 原生協(xié)議,跨語言,跨平臺(tái)的通用中間件代理
- 支持 MySQL 事務(wù)
- 支持 HandshakeV10 協(xié)議版本
- 完美兼容 MySQL5.5 - 8.0
- 兼容各大框架,無縫提升性能
另外,也支持Laravel、ThinkPHP等國內(nèi)主流框架。
所以,如果你正在使用PHP,而且也想使用連接池,那不妨看看這個(gè)工具。
本文標(biāo)題:什么是連接池?如何實(shí)現(xiàn)連接池?
URL鏈接:http://www.5511xx.com/article/djghejg.html


咨詢
建站咨詢
