新聞中心
什么是連接池

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


咨詢
建站咨詢
