IT科技

为什么数据库连接很消耗资源?我竟然答不上来?一下懵了!

字号+作者:益华科技来源:人工智能2025-11-05 15:53:21我要评论(0)

背景本文以连接 MySQL 数据库为例,因为 MySQL 数据库是开源的,其通信协议是公开的,所以我们能够详细分析建立连接的整个过程。分析在本文中,消耗资源的分析主要集中在网络上,当然,资源也包括内存

背景

本文以连接 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); // 之后程序终止,连接被强制关闭1.2.3.4.5.6.7.

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

图片

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

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

第 1 步:建立 TCP 连接,通过三次握手实现。

第 2 步:服务器发送给客户端「握手信息」,客户端响应该握手消息。

第 3 步:客户端「发送认证包」,用于用户验证,验证成功后,服务器返回 OK 响应,之后开始执行命令。

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

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

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

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

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

复制10.416042 - 10.190799 = 0.225243s = 225.243ms1.

这意味着,建立一次数据库连接需要 225ms,而这还是还可以认为是最少的,当然「花费的时间可能受到网络状况、数据库服务器性能以及应用代码是否高效的影响」,来源公众号:码农编程进阶笔记,但是这里只是一个最简单的例子,已经足够说明问题了!鹅厂 MySQL 43连问,这也太细了

由于上面是程序异常终止了,但是在正常的应用程序中,连接的关闭一般都是通过 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();1.2.3.4.5.6.7.

图片

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

第 1 步:此时处于 MySQL 通信协议阶段,客户端发送关闭连接请求,而且不用等待服务端的响应。

第 2 步:TCP 断开连接,4 次挥手完成连接断开。

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

复制747.284311 - 747.100954 = 0.183357s = 183.357ms1.

这里可能也有网络状况的影响,比上述的 225ms 少了,但是也几乎达到了 200ms 的级别。MySQL 索引 15 连问解答,唬住面试官!

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

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

复制100000 * 150ms = 15000000ms = 15000s = 250min = 4.17h1.

也就说每天花费在建立数据库连接上的时间已经达到「4 个小时」,所以说数据库连接池是必须的嘛。【精选】Mysql B-Tree和B+Tree的结构?

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

例如:

缓存 SQL 的预编译 负载均衡  ……

总结

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

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • Ubuntu 14.10已于前段时间发布。想知道如何从 Ubuntu 14.04 升级到 Ubuntu 14.10 么?别担心,这很容易做到。事实上,只要网络连接速度好,升级只是点击几下鼠标的事情而已。你需要从 Ubuntu 14.04 切换到 Ubuntu 14.10 么  在你升级到Ubuntu 14.10之前,请确定你真的想为升级 14.10 而抛弃 Ubuntu 14.04。一个很重要的原因是你不能从Ubuntu 14.10 回归到14.04。 你需要完全重新安装。Ubuntu 14.04是长期支持(LTS)版本。这意味着有更多的稳定性和更长的支持周期。假如升级到14.10,你将被迫在9个月后从Ubuntu 14.10 升级到15.04,而14.04将会持续3年以上。此外,目前Ubuntu 14.10没有很多的新功能使吸引用户切换到14.10。当然了,你肯定会得到最前沿的操作系统。所以,在这之前是否升级到Ubuntu 14.10是你自己的决定。从Ubuntu 14.04 升级到 Ubuntu 14.10 要从Ubuntu 14.04 升级到 Ubuntu 14.10,遵循下面的步骤:步骤 1: 打开 软件和更新.进入更新选项卡。这里要确保Ubuntu有新版本时通知我 设置成对于任何新版本。默认Ubuntu只会在另一个LTS发布时通知你。你必须要把它改成在任何中间版本都升级。步骤 2: 现在运行 软件升级。升级完成后,它应该会提示一个可用的新版本。点击升级,接着按照提示的步骤来。我希望该文教程可以帮助你从 Ubuntu 14.04 升级到 Ubuntu 14.10。虽然本教程是为Ubuntu写的,但是你可以用同样的步骤升级到 Xubuntu 14.10、Kubuntu 14.10 或者Lubuntu。敬请期待下一篇Ubuntu 14.10相关文章。谢谢阅读,希望能帮到大家,请继续关注脚本之家,我们会努力分享更多优秀的文章。

    Ubuntu 14.10已于前段时间发布。想知道如何从 Ubuntu 14.04 升级到 Ubuntu 14.10 么?别担心,这很容易做到。事实上,只要网络连接速度好,升级只是点击几下鼠标的事情而已。你需要从 Ubuntu 14.04 切换到 Ubuntu 14.10 么 在你升级到Ubuntu 14.10之前,请确定你真的想为升级 14.10 而抛弃 Ubuntu 14.04。一个很重要的原因是你不能从Ubuntu 14.10 回归到14.04。 你需要完全重新安装。Ubuntu 14.04是长期支持(LTS)版本。这意味着有更多的稳定性和更长的支持周期。假如升级到14.10,你将被迫在9个月后从Ubuntu 14.10 升级到15.04,而14.04将会持续3年以上。此外,目前Ubuntu 14.10没有很多的新功能使吸引用户切换到14.10。当然了,你肯定会得到最前沿的操作系统。所以,在这之前是否升级到Ubuntu 14.10是你自己的决定。从Ubuntu 14.04 升级到 Ubuntu 14.10 要从Ubuntu 14.04 升级到 Ubuntu 14.10,遵循下面的步骤:步骤 1: 打开 软件和更新.进入更新选项卡。这里要确保Ubuntu有新版本时通知我 设置成对于任何新版本。默认Ubuntu只会在另一个LTS发布时通知你。你必须要把它改成在任何中间版本都升级。步骤 2: 现在运行 软件升级。升级完成后,它应该会提示一个可用的新版本。点击升级,接着按照提示的步骤来。我希望该文教程可以帮助你从 Ubuntu 14.04 升级到 Ubuntu 14.10。虽然本教程是为Ubuntu写的,但是你可以用同样的步骤升级到 Xubuntu 14.10、Kubuntu 14.10 或者Lubuntu。敬请期待下一篇Ubuntu 14.10相关文章。谢谢阅读,希望能帮到大家,请继续关注脚本之家,我们会努力分享更多优秀的文章。

    2025-11-05 15:50

  • F5为OpenTelemtry项目提供降本增效的技术支持

    F5为OpenTelemtry项目提供降本增效的技术支持

    2025-11-05 13:55

  • 不会建数据资产体系的SRE,不是一名好运维

    不会建数据资产体系的SRE,不是一名好运维

    2025-11-05 13:45

  • PowerShell系列:PowerShell脚本执行策略梳理

    PowerShell系列:PowerShell脚本执行策略梳理

    2025-11-05 13:25

网友点评