因為傳統php框架,沒有數據庫連接池,不知道被嘲笑了多少次,包括很多團隊內部,因為沒有數據庫連接池,被java團隊給擠掉。這次我們就聊一聊如何用swoole,實現數據庫連接池。
為什么要創建數據庫連接池?
連接池是可以有效降低MySQL-Server負載的。原理是 連接池使用一個共享資源的模式,如并發100個請求,實際上并不是每個請求的所有時間都在執行SQL查詢。這樣100個請求,共享20個MySQL連接就可以滿足需求了。當一個請求操作完數據庫后,開始進入模板渲染等流程,這時就會釋放數據庫連接給其他的請求使用。
連接池僅在超大型應用中才有價值。普通的應用采用MySQL長連接方案,每個php-fpm創建一個MySQL連接,每臺機器開啟100個php-fpm進程。如果有10臺機器,每臺機器并發的請求為100。實際上只需要創建1000個MySQL連接就能滿足需求,數據庫的壓力并不大。即使有100臺機器,硬件配置好的存儲服務器依然可以承受。
達到數百或者數千臺應用服務器時,MySQL服務器就需要維持十萬級的連接。這時數據庫的壓力就會非常大了。連接池技術就可以派上用場了,可以大大降低數據庫連接數。
如何實現?
1 同步阻塞模式
可基于swoole的AsyncTask模塊實現的連接池,編程簡單,沒有數據同步和鎖的問題。甚至可以多個服務共享連接池。缺點是: 1. 靈活性不如多線程連接池,無法動態增減連接 2. 有一次進程間通信的開銷
2 協程模式
可使用channel實現連接池。
我個人推薦使用協程模式,使用協程效率高。
如果用協程實現?
實現原理,其實swoole也有類似go語言的channel,我們實例化一定數量的mysql的pdo連接,然后把pdo連接放到channel里面,channel支持push和pop,channel是作用域是在整個進程,所以在一個進程中,如果channel已經為空,就得等待其它協程釋放連接資源,否則就會掛起。
長時間不用的連接要定時釋放
可以在進程中,通過一個定時器,檢查每次連接的上次使用時間,如果已經過期,就釋放掉,從而減輕mysql的負載。
大家可以動手試一試,明白了道理后,其實很簡單的。
以上就是“一文教你如何使用swoole實現數據庫連接池,不再被同行嘲笑”的詳細內容,想要獲取更多swoole教程歡迎關注編程學習網
掃碼二維碼 獲取免費視頻學習資料
- 本文固定鏈接: http://phpxs.com/post/8404/
- 轉載請注明:轉載必須在正文中標注并保留原文鏈接
- 掃碼: 掃上方二維碼獲取免費視頻資料