Go與JAVA都有連接池,可以復(fù)用數(shù)據(jù)庫連接
2024-05-12
PHP-fpm是多進(jìn)程模型,進(jìn)程之間共享資源非常困難,所以可以在進(jìn)程內(nèi)共享數(shù)據(jù)庫連接。
連接數(shù)據(jù)庫有兩種模式:短連接和長連接。
接下來我們通過實(shí)驗(yàn)來證明結(jié)果:
測試實(shí)例一
代碼如下所示
.php
true]);
// $dbh=new PDO($dsn,$username,$userpass);
$stmt=$dbh->query('SELECT id FROM im_fri');
$row=$stmt->fetch();
sleep(5);
var_dump($row);
?>
壓力測試
ab -c 100 -n 100
壓力測試期間,在數(shù)據(jù)庫中持續(xù)執(zhí)行。
展示 ; 查看數(shù)據(jù)庫連接線程
結(jié)果如下
長連接情況下的數(shù)據(jù)庫連接線程
我本地的php-fpm最大數(shù)量是5個php連接mysql數(shù)據(jù)庫代碼,紅框是我執(zhí)行壓測腳本時連接的數(shù)據(jù)庫用戶名。 對比上下紅框中內(nèi)容左側(cè)的ID號,發(fā)現(xiàn)是一樣的。 因此,在長連接的情況下,每個進(jìn)程的所有請求都會重用數(shù)據(jù)庫連接。
測試實(shí)例二
代碼如下所示
.php
true]);
$dbh=new PDO($dsn,$username,$userpass);
$stmt=$dbh->query('SELECT id FROM im_fri');
$row=$stmt->fetch();
sleep(5);
var_dump($row);
?>
壓力測試
ab -c 100 -n 100
壓力測試期間,在數(shù)據(jù)庫中持續(xù)執(zhí)行。
展示 ; 查看數(shù)據(jù)庫連接線程
結(jié)果如下
短連接情況下的數(shù)據(jù)庫連接線程
我本地的php-fpm最大數(shù)量是5個,紅框是我執(zhí)行壓測腳本時連接的數(shù)據(jù)庫用戶名。 對比上下紅框中內(nèi)容左側(cè)的ID號,發(fā)現(xiàn)不一樣。 因此php連接mysql數(shù)據(jù)庫代碼,在短連接的情況下,每個進(jìn)程的所有請求都不會重用數(shù)據(jù)庫連接。
官方解釋
() 和 () 非常相似,但有兩個主要區(qū)別。
首先,在連接時網(wǎng)站模板,該函數(shù)將首先嘗試查找已在同一主機(jī)上的同一進(jìn)程中以相同的用戶名和密碼打開的(持久)連接。 如果找到網(wǎng)站優(yōu)化,將返回連接 ID,而不打開新連接。
其次,當(dāng)腳本完成執(zhí)行時,與 SQL 的連接不會關(guān)閉,連接會保持打開狀態(tài)以供將來使用(() 不會關(guān)閉 () 建立的連接)。
這種類型的連接稱為“持久”。
我個人認(rèn)為加上上面紅色部分的文字描述會更準(zhǔn)確。
總之
短連接會在每次請求后自動關(guān)閉連接。
長連接在php-fpm的生命周期內(nèi)只會生成一次。 之后php-fpm進(jìn)程收到的請求會復(fù)用數(shù)據(jù)庫長連接。
懷疑
最后,我有一個問題想問你:
如果php-fpm的數(shù)量為200,數(shù)據(jù)庫的最大連接線程設(shè)置為150,這種情況下會出現(xiàn)什么問題。 如果PHP程序連接失敗并重試會發(fā)生什么情況?