携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情
平时我们做开除了使用开发语言实现功能需求外还需要其他插件的协助,例如redis,mysql,rabbitmq等等。这些外部软件一般都是通过一些通讯协议来调用的,对于着每种开发语言有对于的驱动包。需要我们创建连接才能调用。为什么我们在平时开发过程中不是每次调用都去创建一次链接而是启动应用时就先创建一个连接池,需要是直接从连接池获取呢?因为建立数据库连接很耗时。那么究竟哪里耗时了,今天我们就以Mysql为例分析一下。
MySQL 的通信协议是基于 TCP 传输协议的,而且该协议是二进制协议,不是类似于 HTTP 的文本协议。
其中建立连接的过程具体如下:
- 第 1 步: 建立 TCP 连接,通过三次握手实现。
- 第 2 步: 服务器发送给客户端「握手信息」,客户端响应该握手消息。
- 第 3 步: 客户端「发送认证包」,用于用户验证,验证成功后,服务器返回 OK 响应,之后开始执行命令。
在用户认证完成后,进行链接变量的设置,设置字符集,设置事务等,做完设置之后才会执行业务需要的查询更新操作。在最简单的一个连接动作中客户端和服务端之间最少需要进行5-6次通讯过程,这个初始化的过程我测试了一下大概需要100+ms左右,这个需要根据网络情况具体分析。而且这个时间是我以最少的代码实现连接后测试得出的,所以可以认为它是最少的链接时间。
我们假设一个日请求有5万个请求的web应用,按150毫秒一次链接来计算,一天就需要50000*150/1000/60/60=2.1h,也就是说我们这个web应用每天需要花费2小时来做数据库链接。
所以我们做应用开发是一定要做数据库连接池的操作,不能每次请求做一次新的链接操作。这样可以大大节约我们程序的运行成本。