mysql 长连接接与短连接

2021-07-12 14:33 Mysql 75

长连接与短连接

在 MySQL 数据库中,有着长连接与短连接的概念:

  • 长连接是指连接成功后,如果客户端持续有请求,则一直使用同一个连接,对应在 Web 应用中,就是后端程序与数据库之间的连接建立之后,就会一直重用这个连接(为了提升数据库并发性,可以建立一个数据库连接池),Mysql 的长连接如果长期闲置,Mysql 会8小时后(默认时间)主动断开该连接;

  • 短连接则是指每次执行完很少的几次查询就断开连接,下次查询再重新建立一个,对应在 Web 应用中,就是后端程序与数据库建立连接,完成查询/更新后,就断开连接,下次操作数据库再重连。
    这个和 HTTP 长连接和短连接的概念很像,并且显然,无论是 HTTP 还是 MySQL,使用长连接都能有效减少建立连接过程带来的损耗,进而提升性能。

不过在 MySQL 中,使用长连接会有一定的副作用 —— 有些时候会导致 MySQL 占用内存涨得特别快。这是因为 MySQL 在执行过程中临时使用的内存是管理在连接对象里面的,这些资源只有在连接断开的时候才会释放。对于这个问题,通常有两种解决方案:

  • 定期断开长连接:使用一段时间,或者程序里判断执行过一个占用较大内存的查询后,主动断开连接;
  • 如果使用的是 MySQL 5.7 或者更高版本,可以在每次执行一个比较大的操作后,通过执行 mysql_reset_connection 来重新初始化连接资源。

PHP 程序中使用长连接

使用 PDO 链接 Mysql 时,指定 ATTR_PERSISTENT 属性为 true, 即可开启长连接。在传统 fpm 模式下使用 PDO 长连接一定要控制 fpm 进程数量小于 MySQL 最大连接数,因为每新建一个 fpm 进程就会新建并维护一个数据库连接(如果进程内发起数据库请求的话),不同的 fpm 进程无法共享同一个数据库连接,对于单机应用这可能没什么问题,不过部署 PHP 应用的 Web 应用服务器可是支持水平扩展的,如果扩展到上百台机器,那么 fpm 进程数大于 MySQL 最大连接数的概率就大大增加了,这样导致的结果非常严重 —— 会导致 MySQL 连接数被耗尽,不能响应新的请求。所以项目达到一定规模还是应该去使用数据库连接池技术,例如 swoole 下的连接池技术。

查看mysql最大连接数:

$ show global variables like 'max_connections%'

image

手机扫码浏览 手机扫码查看
赞赏码 给点吧😭