Go 与 JAVA 都有连接池,可以复用数据库的连接,大大减少与数据库连接时的消耗,同时连接池还通过限制连接数量保护下层的数据库。
PHP-fpm 为多进程模型,进程之间共享资源非常困难,所以数据库连接是可以在进程内共享的。
my SQL 连接数据库有两种模式:短连接、长连接。
接下来我们通过实验来证明结果:
测试例子一
代码如下
connect.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
压力测试的过程中不停地在数据库里面执行
show processlist; 查看数据库连接线程
结果如下
我本地的php-fpm最大数量为 5 ,红框为我执行压力测试脚本连接的数据库用户名,对比上下两个红框里面内容左侧的 Id 编号,发现是一样的。所以在长连接情况下,每个进程的所有请求 会复用数据库连接 。
测试例子二
代码如下
connect.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
压力测试的过程中不停地在数据库里面执行
show processlist; 查看数据库连接线程
结果如下
我本地的php-fpm最大数量为 5 ,红框为我执行压力测试脚本连接的数据库用户名,对比上下两个红框里面内容左侧的 Id 编号,发现是不一样的。所以在短连接情况下,每个进程的所有请求 不会复用数据库连接 。
官方解释
mysql_pconnect() 和 mysql_connect() 非常相似,但有两个主要区别。
首先,当连接的时候本函数将先尝试寻找一个在同一个主机上 同一个进程中 用同样的用户名和密码已经打开的(持久)连接,如果找到,则返回此连接标识而不打开新连接。
其次,当脚本执行完毕后到 SQL 服务器的连接不会被关闭,此连接将保持打开以备以后使用(mysql_close() 不会关闭由 mysql_pconnect() 建立的连接)。
此种连接称为“持久的”。
上面红色部分的字个人觉得加上去描述得更准确。
综上所述
短连接每次请求结束之后就会自动关闭连接。
长连接在php-fpm生命周期之内只会生成一次,之后该php-fpm进程接收的请求都会复用该数据库长连接。
疑问
最后再向大家抛出一个疑问:
如果php-fpm的数量为200,MySQL数据库的连接线程最大设置为150,这种情况下会出现什么问题。如果php程序连接失败重试又会产生什么结果呢?
相关文章
本站已关闭游客评论,请登录或者注册后再评论吧~