關於「池「,我們可能遇到連線池、程序池等,池的原理都是相近的,連線池比如有資料庫連線池、redis連線池。我們以資料庫連線池(connection pool)為例,講解一下連線池原理。
傳統的資料庫連線,沒有使用連線池,客戶端連線到資料庫伺服器,每連線一次就建立乙個連線,如果在客戶端訪問量大的時候,資料庫伺服器建立的連線數持續增長,資料庫的可用最大連線數是預先設定好的,比如一次訪問上萬、上千萬的連線,那麼資料庫伺服器的連線數被打滿,每個連線都是乙個執行緒,本身每個執行緒都要耗費伺服器的cpu、記憶體資源,資料庫伺服器的cpu會處理這些連線線程切換,負載壓力就會非常大,連線用完也沒有得到及時的釋放,那麼資料庫伺服器就會被壓垮。實際上,請求次數可以分為請求數、併發數,多數情況請求數遠大於併發數,並不是每個訪問請求都要建立乙個新的連線,也並不是每個請求都要有效連線並使用連線進行資料庫相關操作,有些連線可能空耗了資源沒有得到充分有效的利用。建立連線是系統耗時操作、還要消耗cpu和記憶體的執行緒,如果能重用連線,有效的管理連線資源的使用、釋放,保持一定的連線數,充分提高連線的利用率,降低伺服器資源消耗,使系統壓力減輕。這樣的背景原因下,我們自然就有了連線池的概念。
如果有連線池就不同了,
如併發100個請求,實際上並不是每個請求的所有時間都在執行sql查詢。這樣100個請求,共享20個資料庫mysql連線就可以滿足需求了。當乙個請求操作完資料庫後,開始進入模板渲染等流程,這時就會釋放資料庫連線給其他的請求使用。
資料庫連線池是我們編寫的乙個程式元件,元件啟動時可以預先建立一定數量的資料庫的連線組成乙個連線池,由程式動態地對池中的連線進行申請,使用,釋放。
連線池僅在出現高併發的應用中才有價值,連線池並沒有提高sql的查詢速度,連線池是用來保護資料庫的,不是用來提公升效能的。
當併發請求qps達到數萬或者數十萬時,mysql伺服器就需要維持十萬級的連線。這時資料庫的壓力就會非常大了。連線池技術就可以派上用場了,可以大大降低資料庫連線數,減入伺服器壓力。
可能有些人認為使用連線池可以提高效能,其實不然,連線池並不能直接的提高效能,在訪問量不大,低併發情況下,不會對效能提公升,在訪問量大、高併發情況下,可以降低伺服器資源消耗,間接的提公升效能。
資料的連線池為維持若干個長連線,當新請求到達的時候,如果連線池有空閒
連線,就分配給連線池去處理,否則,後面的資料庫連線請求將被加入到等待佇列中。
(1) 程式初始化時建立連線池;
(2)
使用時向連線池申請可用連線;
(3)
使用完畢,將連線返還給連線池;
(4)
程式退出時,斷開連線,並釋放資源;
1、建立連線:連線池啟動後,初始化一定的空閒連線,指定為最少的連線min。當連線池為空,不夠用時,建立新的連線放到池裡,但不能超過指定的最大連線max數量。
2、連線釋放:每次使用完連線,一定要呼叫釋放方法,把連線放回池中,給其他程式或請求使用。
3、連線分配:連線池中用pop和push的方式對等入隊和出隊分配與**。能實現阻塞分配,也就是在池空並且已建立數量大於max,阻塞一定時間等待其他請求的連線釋放,超時則返回null。
4、連線管理:對連線池中的連線,定時檢活和釋放空閒連線等。
下面是乙個連線池的**。
class pool
public static function get_instance()
return self::$instance;
}public function init()
}/**
* 建立連線
*/public function createconnection()catch (\exception $e)
return $swoole_mysql;
}/**
* 獲取連線
*/public function getconnection()else
}else
//2.如果連線超過要等待
return $obj;
}/**
* 釋放連線(重新回到連線池)
*/public function freeconnection($obj)
}
持續完善、待續... 資料庫連線池的原理。為什麼要使用連線池。
資料庫連線是一種關鍵的有限的昂貴的資源,對資料庫連線的管理能顯著影響到整個應用程式的伸縮性和健壯性,影響到程式 的效能指標。資料庫連線池正是針對這個問題提出來的。資料庫連線池負責分配 管理和釋放資料庫連線,它允許應用程式重複使用乙個現有的資料庫連線,而不是重新建立乙個 釋 放空閒時間超過最大空閒時間...
資料庫連線池的原理。為什麼要使用連線池。
資料庫連線是一種關鍵的有限的昂貴的資源,對資料庫連線的管理能顯著影響到整個應用程式的伸縮性和健壯性,影響到程式 的效能指標。資料庫連線池正是針對這個問題提出來的。資料庫連線池負責分配 管理和釋放資料庫連線,它允許應用程式重複使用乙個現有的資料庫連線,而不是重新建立乙個 釋 放空閒時間超過最大空閒時間...
資料庫連線池的原理。為什麼要使用連線池?
資料庫連線池的原理。為什麼要使用連線池?資料庫連線是一種關鍵的有限的昂貴的資源,對資料庫連線的管理能顯著影響到整個應用程式的伸縮性和健壯性,影響到程式 的效能指標。資料庫連線池正是針對這個問題提出來的。資料庫連線池負責分配 管理和釋放資料庫連線,它允許應用程式重複使用乙個現有的資料庫連線,而不是重新...