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