为什么数据库连接很消耗资源?

为什么数据库连接很消耗资源 开发应用程序久了,总想刨根问底,尤其对一些有公共答案的问题。大家都能解释,但是追根究底,都解释不清。凡是都有为什么,而且用数字说明问题是最直观的。 本文主要想探究一下连接数据库的细节,尤其是在Web应用中要使用数据库来连接池,以免每次发送一次请求就重新建立一次连接。对于这个问题,答案都是一致的,建立数据库连接很耗时,但是这个耗时是都多少呢,又是分别在哪些方面产生的耗时呢? 阅读详情

1背景

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

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

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

2分析

本文以连接 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 的文本协议。

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

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

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

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

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

在本文的测试中,只用了 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();

图片

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

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

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

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

747.284311 - 747.100954 = 0.183357s = 183.357ms

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

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

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

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

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

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

例如:

  • 缓存

  • SQL 的预编译

  • 负载均衡

  • ……

3总结

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

区块链技术在碳足迹数据存证与溯源中的应用深度解析 消费者扫描产品上的二维码,即可通过区块链浏览器查询到该产品的数字碳标签,并追溯其从茶园到货架的每一步碳足迹数据,以及这些数据是如何被智能合约自动计算和认证的,从而建立起强大的品牌信任。如果说哈希链解决了数据的“存”与“证”的问题,那么智能合约则解决了数据“用”与“管”的自动化问题。综上所述,虽然针对“碳足迹数据可追溯性”这一特定应用场景的公开、标准化的性能基准案例尚不丰富,但现有研究和企业级解决方案(特别是联盟链)已经证明,通过合理的技术选型和架构设计,区块链的性能可以满足实际商业需求。 阅读详情

相关推荐

Frida实战:如何用adb快速连接网易mumu模拟器进行参数Hook(附常见CPU架构问题排查)

本文详细介绍了如何使用Frida和adb快速连接网易MuMu模拟器进行参数Hook,包括环境配置、架构适配、Frida-server部署及常见问题排查。特别针对CPU架构兼容性问题提供了实用解决方案,帮助开发者高效完成逆向调试任务。

weixin_29274969的博客 290

mysql 连接 耗时吗_为什么数据库连接很消耗资源

开发应用程序久了,总想刨根问底,尤其对一些有公共答案的问题。大家都能解释,但是追根究底,都解释不清。凡是都有为什么,而且用数字说明问题是最直观的。本文主要想探究一下连接数据库的细节,尤其是在Web应用中要使用数据库来连接池,以免每次发送一次请求就重新建立一次连接。对于这个问题,答案都是一致的,建立数据库连接很耗时,但是这个耗时是都多少呢,又是分别在哪些方面产生的耗时呢?本文以连接MySQL数据库为...

weixin_30693337的博客 1663

使用 Wireshark 进行计算机网络协议分析

文章目录实验前准备一、Wireshark抓包示例二、Wireshark实作1、数据链路层实作一 熟悉Ethernet帧结构实作二 了解子网内/外通信时的 MAC 地址实作三 掌握 ARP 解析过程2、网络层实作一 熟悉 IP 包结构实作二 IP 包的分段与重组实作三 考察 TTL 事件3、传输层实作一 熟悉 TCP 和 UDP 段结构实作二 分析 TCP 建立和释放连接4、应用层实作一 了解 DNS 解析实作二 了解 HTTP 的请求和应答 实验前准备 本部分实验用到的是抓包和协议分析软件——Wiresha

weixin_51087836的博客 8201

数据库连接为何消耗大量资源?

在信息技术领域,数据库连接是至关重要的一环,它允许应用程序与数据库服务器进行交互,从而存取和操作数据。然而,数据库连接也是一个资源消耗较大的过程。下面,我们将深入探讨为什么数据库连接会消耗大量资源,并分析其背后的技术原因。一、连接过程的复杂性数据库连接并不是一个简单的“开关”动作,而是一个涉及多个步骤和组件的复杂过程。在客户端和数据库服务器之间建立连接时,需要进行一系列的手握手和认证操作。这些操作...

dotNET跨平台 350

Shopee 虾皮API接口:商品详情采集的实践

随着电商行业的蓬勃发展,数据采集和分析在商业决策中扮演着越来越重要的角色。Shopee作为东南亚领先的电商平台,拥有大量的商品数据。通过Shopee的API接口,我们可以方便地获取商品详情,为数据分析和市场研究提供有力支持。本文将介绍如何使用Shopee API接口采集商品详情,并分享一些实践技巧。提供了丰富的数据接口,包括商品详情、店铺信息、订单数据等。通过API接口,开发者可以轻松地获取Shopee平台上的数据,进行进一步的处理和分析。Shopee API接口:商品详情采集的实践与技巧。

An4480的博客 1889

ROS激光雷达动态避障算法优化(C++实战)

本文深入探讨了ROS激光雷达动态避障算法的C++实战优化。针对动态环境的核心挑战,文章系统性地介绍了从激光数据预处理(降噪、瘦身)、动态障碍物检测与跟踪,到基于动态窗口法(DWA)的智能决策与调优的全流程。重点分享了如何将障碍物速度预测融入DWA打分函数,以实现更安全、流畅的避障,并提供了工程架构、性能优化及真机调试的实用建议。

weixin_29192141的博客 947

DriverManager.getConnection()部署到linux服务器后连接延迟问题

DriverManager.getConnection()部署到linux服务器后连接延迟问题 一,Linux中/etc/resolv.conf文件简析 /etc/resolv.conf是DNS客户机配置文件,用于设置DNS服务器的IP地址及DNS域名,还包含了主机的域名搜索顺序。 该文件是由域名解析 器(resolver,一个根据主机名解析IP地址的库)使用的配置文件。 二,删除Linux中/etc/resolv.conf 该配置文件影响DriverManager.getConnecti

Myxpy的博客 818

PCL DBSCAN密度聚类【2026最新版】

点云密度聚类的PCL代码实现,与matlab自带的密度聚类算法进行对比验证,结果一致。3万多个点能再2秒左右运行出结果,算法效率尚可。

点云侠的博客 5682

问:为什么数据库连接消耗资源?

本文深入探讨了数据库连接的高资源消耗问题,包括连接建立过程、资源消耗分析及解决方案。通过Java代码示例展示了数据库连接的建立,并详细分析了连接过程中的内存、CPU、网络及时间消耗。文章介绍了数据库连接池作为解决方案,并讨论了其优势与潜在问题。最后强调,在大数据和云计算时代,架构优化是确保服务稳定与高效的关键。

技术铺掌柜 1062

一文吃透:从零到一开发一套 ABAP RAP 应用的完整路径

ABAP RAP开发实战摘要 本文系统介绍了ABAP RESTful Application Programming Model (RAP)在企业级应用开发中的实施路径。文章以出差申请业务场景为例,详细拆解了RAP开发的六步主线流程: 数据库表设计:规范主键、审计字段设计 CDS数据建模:通过视图定义业务对象实体及关联 行为定义与实现:使用BDEF声明事务规则,Behavior Pool类实现业务逻辑 业务对象投影:裁剪服务接口视图 服务定义与绑定:按OData协议暴露服务 UI集成测试:支持Fiori E

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 510

【WRF安装】完整自动化 WRF-ARW/WRF-Chem 安装脚本(多服务器测试)

【WRF安装】完整自动化 WRF-ARW/WRF-Chem 安装脚本(多服务器测试)

WW、forever的博客 285

为什么说数据库连接很消耗资源

在这个最简单的代码中,没有设置任何额外的连接属性,所以在设置属性上占用的时间可以认为是最少的(其实,虽然我们没有设置任何属性,但是驱动仍然设置了字符集、事务自动提交等,这取决于具体的驱动实现),所以整个连接所使用的时间可以认为是最少的。对于这个问题,答案都是一致的,建立数据库连接很耗时,但是这个耗时是都多少呢,又是分别在哪些方面产生的耗时呢?,而这还是还可以认为是最少的,当然「花费的时间可能受到网络状况、数据库服务器性能以及应用代码是否高效的影响」 ,但是这里只是一个最简单的例子,已经足够说明问题了!

Tyson0314的博客 938

RK3588 部署 YOLOv5s 实战:多线程加速从 16FPS 飙升到 120FPS(含性能优化)

因为RK3588包含了3个NPU核心,支持3个核心同时工作、双核合作、以及单核工作。我们可以使用线程池来加速。线程池是一种长街的并发编程模型,它用于管理和复用线程,以提高多线程程序的性能和效率。线程池通常包含以下主要组件:1、任务队列:任务队列用于存储待执行的任务。这些任务可以是函数、方法或其他需要多线程环境中执行的操作。2、线程池管理:线程池管理器负责创建、销毁和管理线程。它会监视任务队列中的任务,根据需要创建线程,执行任务,并在任务完成后将线程放回池中以供重用。

FJN110的博客 100

php mysql连接消耗资源_为什么数据库连接很消耗资源 转

开发应用程序久了,总想刨根问底,尤其对一些有公共答案的问题。大家都能解释,但是追根究底,都解释不清。凡是都有为什么,而且用数字说明问题是最直观的。本文主要想探究一下连接数据库的细节,尤其是在Web应用中要使用数据库来连接池,以免每次发送一次请求就重新建立一次连接。对于这个问题,答案都是一致的,建立数据库连接很耗时,但是这个耗时是都多少呢,又是分别在哪些方面产生的耗时呢?本文以连接MySQL数据库为...

weixin_42499692的博客 258

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

上一篇: 代码中 isEmpty 和 isBlank 的区别
下一篇: WebSocket 在SpringBoot 的 3 种集成方式!!
架构文摘JGWZ
博客等级 码龄5年 8808粉丝 345原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值