连接器

如果你在 Linux 操作系统里要使用 MySQL,那你第一步肯定是要先连接 MySQL 服务,然后才能执行 SQL 语句
连接的过程需要先经过 TCP 三次握手,因为 MySQL 是基于 TCP 协议进行传输的

查看MySQL服务被多少客户端连接

如果你想知道当前 MySQL 服务被多少个客户端连接了,你可以执行 show processlist 命令进行查看。

show processlist

mysql数据库连接池有哪些 mysql数据库连接器_客户端


比如上图的显示结果,共有两个用户名为 root 的用户连接了 MySQL 服务,其中 id 为 9 的用户的 Command 列的状态为 Sleep ,这意味着该用户连接完 MySQL 服务就没有再执行过任何命令,也就是说这是一个空闲的连接,并且空闲的时长是 8839 秒( Time 列)。

空闲连接会一直占用?

不是,MySQL 定义了空闲连接的最大空闲时长,由 wait_timeout 参数控制的,默认值是 8 小时(28880秒),如果空闲连接超过了这个时间,连接器就会自动将它断开。

show variables like 'wait_timeout';

mysql数据库连接池有哪些 mysql数据库连接器_mysql数据库连接池有哪些_02


我们自己也可以手动断开空闲的连接,使用的是 kill connection + id 的命令。

kill connection + 9

mysql数据库连接池有哪些 mysql数据库连接器_客户端_03


执行后没有这个连接了

mysql数据库连接池有哪些 mysql数据库连接器_长连接_04

MySQL 连接数限制

MySQL 服务支持的最大连接数由 max_connections 参数控制,比如我的 MySQL 服务默认是 151 个,超过这个值,系统就会拒绝接下来的连接请求,并报错提示“Too many connections”。

show variables like 'max_connections';

mysql数据库连接池有哪些 mysql数据库连接器_长连接_05


MySQL 的连接也跟 HTTP 一样,有短连接和长连接的概念

使用长连接的好处就是可以减少建立连接和断开连接的过程,所以一般是推荐使用长连接。

但是,使用长连接后可能会占用内存增多,因为 MySQL 在执行查询过程中临时使用内存管理连接对象,这些连接对象资源只有在连接断开时才会释放。如果长连接累计很多,将导致 MySQL 服务占用内存太大,有可能会被系统强制杀掉,这样会发生 MySQL 服务异常重启的现象。

解决长连接占用内存问题

有两种解决方式。
第一种,定期断开长连接。既然断开连接后就会释放连接占用的内存资源,那么我们可以定期断开长连接。

第二种,客户端主动重置连接。MySQL 5.7 版本实现了 mysql_reset_connection() 函数的接口,注意这是接口函数不是命令,那么当客户端执行了一个很大的操作后,在代码里调用 mysql_reset_connection 函数来重置连接,达到释放内存的效果。这个过程不需要重连和重新做权限验证,但是会将连接恢复到刚刚创建完时的状态。

至此,连接器的工作做完了,简单总结一下:
与客户端进行 TCP 三次握手建立连接;
校验客户端的用户名和密码,如果用户名或密码不对,则会报错;
如果用户名和密码都对了,会读取该用户的权限,然后后面的权限逻辑判断都基于此时读取到的权限;