当前位置: 首页 > news >正文

面试官问你:为什么频繁连接MySQL数据库会消耗很多资源?

开发应用程序久了,总想刨根问底,尤其对一些有公共答案的问题。大家都能解释,但是追根究底,都解释不清。凡是都有为什么,而且用数字说明问题是最直观的。

本文主要想探究一下连接数据库的细节,尤其是在 Web 应用中要使用数据库来连接池,以免每次发送一次请求就重新建立一次连接。

对于这个问题,答案都是一致的,建立数据库连接很耗时,但是这个耗时是都多少呢,又是分别在哪些方面产生的耗时呢?

分析

本文以连接 MySQL 数据库为例,因为 MySQL 数据库是开源的,其通信协议是公开的,所以我们能够详细分析建立连接的整个过程。

在本文中,消耗资源的分析主要集中在网络上,当然,资源也包括内存、CPU 等计算资源,使用的编程语言是 Java,但是不排除编程语言也会有一定的影响。

首先先看一下连接数据库的 Java 代码,如下:

Class.forName("com.mysql.jdbc.Driver"); String name = "shine_user"; String password = "123"; String url = "jdbc:mysql://172.16.100.131:3306/clever_mg_test"; Connection conn = DriverManager.getConnection(url, name, password); // 之后程序终止,连接被强制关闭

然后通过「Wireshark」分析整个连接的建立过程,如下:

在上图中显示的连接过程中,可以看出 MySQL 的通信协议是基于 TCP 传输协议的,而且该协议是二进制协议,不是类似于 HTTP 的文本协议。

其中建立连接的过程具体如下:

用户验证成功之后,会进行一些连接变量的设置,比如字符集、是否自动提交事务等,其间会有多次数据的交互。完成了这些步骤后,才会执行真正的数据查询和更新等操作。

在本文的测试中,只用了 5 行代码来建立连接,但是并没有通过该连接去执行任何操作,所以在程序执行完毕之后,连接不是通过 Connection.close() 关闭的,而是由于程序执行完毕,导致进程终止,造成与数据库的连接异常关闭,所以最后会出现 TCP 的 RST 报文。

在这个最简单的代码中,没有设置任何额外的连接属性,所以在设置属性上占用的时间可以认为是最少的(其实,虽然我们没有设置任何属性,但是驱动仍然设置了字符集、事务自动提交等,这取决于具体的驱动实现),所以整个连接所使用的时间可以认为是最少的。

但从统计信息中可以看出,在不包括最后 TCP 的 RST 报文时(因为该报文不需要服务器返回任何响应),但是其中仍需在客户端和服务器之间进行往返「7」次,「也就是说完成一次连接,可以认为,数据在客户端和服务器之间需要至少往返 7 次」。

从时间上来看,从开始 TCP 的三次握手,到最终连接强制断开为止(不包括最后的 RST 报文),总共花费了:

10.416042 - 10.190799 = 0.225243s = 225.243ms

这意味着,建立一次数据库连接需要 225ms,而这还是还可以认为是最少的,当然「花费的时间可能受到网络状况、数据库服务器性能以及应用代码是否高效的影响」,但是这里只是一个最简单的例子,已经足够说明问题了!

由于上面是程序异常终止了,但是在正常的应用程序中,连接的关闭一般都是通过 Connection.close() 完成的。

代码如下:

Class.forName("com.mysql.jdbc.Driver"); String name = "shine_user"; String password = "123"; String url = "jdbc:mysql://172.16.100.131:3306/clever_mg_test"; Connection conn = DriverManager.getConnection(url, name, password); conn.close();

这样的话,情况发生了变化,主要体现在与数据库连接的断开,如上图:

这里是完整地完成了从数据库连接的建立到关闭,整个过程花费了:

747.284311 - 747.100954 = 0.183357s = 183.357ms

这里可能也有网络状况的影响,比上述的 225ms 少了,但是也几乎达到了 200ms 的级别。

那么问题来了,想象一下这个场景,对于一个日活 2 万的网站来说,假设每个用户只会发送 5 个请求,那么一天就是 10 万个请求。

对于建立数据库连接,我们保守一点计算为 150ms 好了,那么一天当中花费在建立数据库连接的时间有(还不包括执行查询和更新操作):

100000 * 150ms = 15000000ms = 15000s = 250min = 4.17h

也就说每天花费在建立数据库连接上的时间已经达到「4 个小时」,所以说数据库连接池是必须的嘛。

而且当日活增加时,单单使用数据库连接池也不能完全保证你的服务能够正常运行,还需要考虑其他的解决方案。
例如:

总结

当然这不是本文的主要内容,本文想要阐述的核心思想只有一个,数据库连接真的很耗时,所以不要频繁的建立连接。

感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取

http://www.cnnetsun.cn/news/833956.html

相关文章:

  • 4步搞定黑苹果配置:面向硬件爱好者的智能配置工具
  • 软件测试之压力测试详解
  • 最新排名揭示,6个AI论文工具可同步提升写作质量与降低重复率
  • AI技术支持的6款论文工具,兼具高效写作与智能改写功能
  • 如何用OpCore-Simplify轻松配置黑苹果?3个核心优势让复杂EFI制作变简单
  • AI技术革新科研流程,开题报告撰写效率倍增
  • 图片批量加水印神器,多种水印添加方式,文字水印,图片水印,满屏水印,永久免费使用,无需联网离线也可,完美保护隐私
  • 2026年AI大模型人才需求爆发,8大核心岗位能力要求全解析
  • 解锁高效歌词提取:开源工具的5个专业级实用技巧
  • 从噪点到模型:3D扫描数据修复与切片优化实战指南
  • 零基础掌握图像修复技术:AI图像编辑核心技巧与智能修复工具应用指南
  • 流媒体检测工具技术指南:效率提升与资源优化实践
  • 告别黑苹果配置噩梦:OpCore Simplify智能配置工具让技术民主化
  • Open Notebook:隐私优先的本地部署多模型兼容AI笔记工具
  • 还在为APP测试熬秃头?这款AI工具让你效率飞升10倍!
  • 两足行走机器人行走控制部分设计
  • SQLite3学习笔记3:UTC和CST 时区偏差问题
  • 彻底解决Play Integrity验证限制:自定义ROM用户的5个突破技巧
  • 手把手教你学Simulink--电机电磁兼容与可靠性​场景示例:基于Simulink的电机轴电压与轴电流抑制仿真
  • 百度网盘命令行工具BaiduPCS-Go:高效文件管理指南
  • 从零搭建企业级开源仓库管理系统:KopSoft WMS实战指南
  • 如何高效配置微信防撤回补丁:3个步骤轻松掌握消息保护功能
  • 4个革命性技巧:用Kronos实现智能股票预测的超额收益
  • 一文解读Qwen3文本嵌入与重排序技术版图,零基础小白收藏这一篇就够了!
  • RAGFlow想说爱你不容易,win10环境搭建、常用修改
  • 2025如何学习Agent?谷歌重磅发布Agent白皮书
  • 颠覆式单文件库:重构C/C++开发的依赖管理与性能边界
  • KopSoft WMS仓库管理系统企业级部署实战指南
  • 3大核心功能掌握Kohya_ss:高效AI模型训练全方位指南
  • 走进吴忠码上羽毛球俱乐部:专业教练引路,科技助力成长