Go与JAVA都有连接池,可以复用数据库连接
2024-05-12
PHP-fpm是多进程模型,进程之间共享资源非常困难,所以可以在进程内共享数据库连接。
连接数据库有两种模式:短连接和长连接。
接下来我们通过实验来证明结果:
测试实例一
代码如下所示
.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
压力测试期间,在数据库中持续执行。
展示 ; 查看数据库连接线程
结果如下
长连接情况下的数据库连接线程
我本地的php-fpm最大数量是5个php连接mysql数据库代码,红框是我执行压测脚本时连接的数据库用户名。 对比上下红框中内容左侧的ID号,发现是一样的。 因此,在长连接的情况下,每个进程的所有请求都会重用数据库连接。
测试实例二
代码如下所示
.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
压力测试期间,在数据库中持续执行。
展示 ; 查看数据库连接线程
结果如下
短连接情况下的数据库连接线程
我本地的php-fpm最大数量是5个,红框是我执行压测脚本时连接的数据库用户名。 对比上下红框中内容左侧的ID号,发现不一样。 因此php连接mysql数据库代码,在短连接的情况下,每个进程的所有请求都不会重用数据库连接。
官方解释
() 和 () 非常相似,但有两个主要区别。
首先,在连接时网站模板,该函数将首先尝试查找已在同一主机上的同一进程中以相同的用户名和密码打开的(持久)连接。 如果找到网站优化,将返回连接 ID,而不打开新连接。
其次,当脚本完成执行时,与 SQL 的连接不会关闭,连接会保持打开状态以供将来使用(() 不会关闭 () 建立的连接)。
这种类型的连接称为“持久”。
我个人认为加上上面红色部分的文字描述会更准确。
总之
短连接会在每次请求后自动关闭连接。
长连接在php-fpm的生命周期内只会生成一次。 之后php-fpm进程收到的请求会复用数据库长连接。
怀疑
最后,我有一个问题想问你:
如果php-fpm的数量为200,数据库的最大连接线程设置为150,这种情况下会出现什么问题。 如果PHP程序连接失败并重试会发生什么情况?