Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【腾讯二面】5s内建立多少个mysql连接?

【腾讯二面】5s内建立多少个mysql连接?

作者头像
moon聊技术
发布于 2021-10-20 05:38:06
发布于 2021-10-20 05:38:06
7770
举报
文章被收录于专栏:moon聊技术moon聊技术

以100每秒的速度向mysql写数据,持续5s,此时我们的程序和mysql建立了多少个tcp连接?

从编程的角度来看,一个问题的解答过程,无非是寻求输入输出,这里输出是多少个tcp连接,那么就要锁定输入,也就是参数,有哪些因素会影响这个问题?

在牛牛看来只有两点:mysql当前处理能力和连接池配置。

参数分析

1.mysql处理能力

  • 如果负载正常的情况,mysql 1s内一定能处理100个请求。
  • 如果负载比较高,那1s内就处理不完,为了方便讨论,这里假设1s能处理50个请求。

PS: 正常实体机的mysql,即使配置差到1核1G,也完全能胜任100/s的单纯插入请求。只有在mysql本身异常,或有其他进程占用系统资源时,才会出现1s处理不过来100个请求的情况。这里的两个分支只是逻辑上的讨论。

2.连接池

连接池是实现连接复用的手段,和mysql交互时,每次需要建立一个连接,用完就会关掉,这就是短连接。如果在高并发场景,反复建立连接的成本是很高的,所以我们可以使用长连接,即连接用完后先不关闭,放到一个池子里等待复用,这个池子就叫连接池。

如图所示,连接池暂存了使用完成之后的mysql连接以待复用,最大空闲连接数就是这个池子的大小。连接池通过一系列参数控制了针对mysql的连接复用策略,一般是由客户端引擎实现,支持哪些参数也由客户端引擎决定,通常而言所有的客户端引擎都支持如下几个主要参数:

  • 最大连接数:支持的最大连接数,即能打开连接的最大上限,如果超过这个阈值,就会出现too many connections的提示,这个数字通常可以设置得较大,以应对突如其来的峰值。
  • 最大空闲连接数: 这个参数在上图有标注,表示连接池中最多有多少个空闲连接 ,某个连接做完事务之后暂时空闲,如果连接池中空闲连接数没有达到上限,即可放入连接池。该参数其实可以理解为一共可维护多少个长连接来节约连接建立的成本。
  • 最长空闲时间: 连接池中连接使用完毕后会等到新的请求到来,表明了连接池中的连接在空闲时能在池子里摸鱼多久,如果长时间没有请求到来,说明请求量非常小,此时就需要释放掉连接来节省资源,等待多久,就是由该参数决定,本牛的建议是通常情况下10-20s就足够了。
  • 最小连接数: 连接池中最小空闲连接数,当连接数少于此值时,连接池会创建新的连接来进行补充,作用主要是保持连接池始终处于就绪状态,如果需要的长连接特别多,且请求是周期性的,比如晚上才有的情况下,可以考虑使用该参数。
  • 初始化连接数:初始化连接数目,实际意义不大,由最小连接数补齐即可。

可以看到,最大连接数、最大空闲连接数以及最大空闲时间,这三个参数是起决定作用的。最大连接数保证了长连接➕短连接的上限,避免了单一程序耗尽mysql的连接资源。最大空闲连接数决定了长连接的个数,最大空闲时间则决定了长连接的持续性。

参数正交

回到该题目上看,我们利用控制变量来分析,最大连接数和最大空闲时间我们假设足够大,以保证mysql的正常响应和长连接的可持续性。剩下的就是mysql本身消费能力,和最大空闲连接数即长连接数两个维度的正交了,我们分如下情况:

  1. 处理能力足够,且连接能完全复用:请求速度为100每秒,如果我们的最大空闲连接参数设置为100,而mysql处于正常状态,每秒能完成100个请求·,则一共建立了100个连接。
  2. 处理能力不足,最大空闲连接数足够大:请求以100每秒,如果我们的最大空闲连接数设置为100, 而mysql有负载压力,每秒完成50个请求,这里我们假设mysql处理都是按先入先出,即同一秒产生的请求,因为会先复用连接池,所以连接池那部分会先处理完毕,处理流程如图所示:

圆圈中50:x表示这50个连接是在第x秒产生;长连接中doing表示准备处理中,done表示做完;短连接默认都是doing;红色字体表示下一秒就会处理,连线表明某个连接的前世今生。

第一秒

由于连接池为空,产生100个

第二秒

复用连接池的50个,产生50个

第三秒

复用连接池的50个,产生50个

第四秒

复用连接池的50个,产生50个

第五秒

连接池都在忙绿中,新产生100个

  1. 处理能力足够,但连接池最大空闲连接数较小:请求速度为100每秒,如果我们的最大空闲连接数设置为50,而mysql处于正常状态,每秒完成100个请求,则100➕4✖50
  2. 处理能力不足,且连接池最大空闲连接数较小:请求速度为100每秒,如果我们的最大空闲连接数设置为50, 而mysql有负载压力,每秒只能完成50个请求。这种情况可按照场景2进行分析,欢迎有兴趣的读者在留言区交流。

小结

简简单单一个问题,牵引出的其实是mysql连接池的本质,这也是面试官面试时想考察的能力。

这个问题至少能考察出面试者两方面的能力,一是看面试者的思路是否清晰,在实际业务场景中提出来的需求,大多需要仔细思考来判断存在哪些影响因素,而在面试中留给面试者思考的时间并不多,大家的能力高下立判;第二点则是了解面试者对这些基本知识点的掌握情况,这也是对面试者的知识储备进行考察。

牛牛比较认可这种结合实际场景的面试题目,希望阅读完本篇文章之后大家能有所收获。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-10-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 moon聊技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
jdbc是数据库连接池么_java的jdbc连接数据库
JDBC 是Java应用程序用来连接关系型数据库的标准API,为多种关系型数据库提供一个统一的访问接口。Sun公司一共定义4种 JDBC 驱动类型,一般使用第4种,该类型的Driver完全由Java代码实现,通过使用socket与数据库进行通信。
全栈程序员站长
2022/09/30
3.3K0
jdbc是数据库连接池么_java的jdbc连接数据库
MySQL 最佳实践:程序端连接池配置
现代网站架构/业务架构越来越重视横向拓展的能力,随之而来的是 Server 或者容器的数量快速增长,但是传统 RDBMS 的扩展性无法跟上这种步伐,导致大量的数据库连接不断的在数据库端创建、断开,不仅性能方面受到影响,在个别极端情况下也会导致数据库本身出现卡死等影响业务的现象。
王文安@DBA
2020/09/30
5.3K0
MySQL 最佳实践:程序端连接池配置
如何减少频繁创建数据库连接的性能损耗?
大多系统初生时就是这样,只是随业务不但发展变得复杂,架构迭代。系统上线后,虽用户量不大,但运行一切正常。不过领导觉得用户量太少,紧急调动运营做了某音的推广。带来大波流量,系统访问速度突然开始变慢。
JavaEdge
2023/01/16
1.7K0
MySQL的连接池和连接管理:提高性能和可靠性
MySQL的连接池和连接管理是提高性能和可靠性的关键组件之一。在高并发场景下,合理地使用连接池和进行连接管理可以减少数据库连接的创建和销毁开销,提高系统的响应速度和资源利用率,同时有效地避免连接泄露和连接超时等问题。
用户1289394
2024/04/30
5940
MySQL的连接池和连接管理:提高性能和可靠性
数据库链接池
数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出。 一个数据库连接对象均对应一个物理数据库连接,每次操作都打开一个物理连接,使用完都关闭连接,这样造成系统的 性能低下。 数据库连接池的解决方案是在应用程序启动时建立足够的数据库连接,并讲这些连接组成一个连接池(简单说:在一个“池”里放了好多半成品的数据库联接对象),由应用程序动态地对池中的连接进行申请、使用和释放。对于多于连接池中连接数的并发请求,应该在请求队列中排队等待。并且应用程序可以根据池中连接的使用率,动态增加或减少池中的连接数。 连接池技术尽可能多地重用了消耗内存地资源,大大节省了内存,提高了服务器地服务效率,能够支持更多的客户服务。通过使用连接池,将大大提高程序运行效率,同时,我们可以通过其自身的管理机制来监视数据库连接的数量、使用情况等。
鱼找水需要时间
2023/03/15
2.4K0
数据库链接池
数据库连接池:从JDBC到高效管理的演进
从最初的JDBC手动连接数据库,到后来的ORM框架如iBATIS,再到数据库连接池如C3P0,技术的进步和互联网的发展速度是非常惊人的。现在层出不穷的各种中间件和脚手架,都是为了提高开发效率,降低开发难度,让开发者能够更专注于业务逻辑的实现。
不惑
2024/05/07
4360
数据库连接池:从JDBC到高效管理的演进
数据库连接池极简教程
一,常规数据库连接 常规数据库连接一般由以下六个步骤构成: 装载数据库驱动程序; 建立数据库连接; 创建数据库操作对象 访问数据库,执行sql语句; 处理返回结果集 断开数据库连接。 public
架构师小秘圈
2018/04/02
2K0
数据库连接池极简教程
连接池技术:简单而强大的加速数据库访问方法
以操作数据库为例,当一个数据库操作任务到来时,程序需要和数据库建立连接,进行三次握手、数据库用户验证,然后执行SQL语句,最后用户退出、四次挥手关闭连接。每次任务都执行这样的流程,那么整个流程中,真正有效而且变化的只有<执行SQL语句>这一步骤,而且每次建立连接、用户验证、关闭连接都耗费时间。
Lion 莱恩呀
2024/09/24
2880
连接池技术:简单而强大的加速数据库访问方法
MySQL性能优化必知:长连接、短连接、连接池
当数据库服务器和客户端位于不同的主机时,就需要建立网络连接来进行通信。客户端必须使用数据库连接来发送命令和接收应答、数据。通过提供给客户端数据库的驱动指定连接字符串后,客户端就可以和数据库建立连接了。可以查阅程序语言手册来获知通过何种方式使用短连接、长连接。
码农架构
2021/01/25
9.4K1
k8s的 Nginx Ingress 调优
Nginx Ingress Controller 基于 Nginx 实现了 Kubernetes Ingress API,Nginx 是公认的高性能网关,但如果不对其进行一些参数调优,就不能充分发挥出高性能的优势。Nginx Ingress工作原理:
没有故事的陈师傅
2021/08/13
3.5K0
用了那么久的ORM框架,你真的有了解HikariCP、Druid吗?
在高并发访问或长时间运行的应用中,MySQL数据库的连接资源耗尽会引发严重的线上问题。这类问题通常导致应用服务崩溃、请求阻塞、连接超时等一系列影响用户体验的现象。本文将深入探讨MySQL连接池资源耗尽的原因、如何进行性能测试对比HikariCP和Druid连接池的表现,以及高效的优化方案。
不惑
2025/01/03
8670
用了那么久的ORM框架,你真的有了解HikariCP、Druid吗?
数据库连接池学习笔记(一):原理介绍+常用连接池介绍
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个。
全栈程序员站长
2022/09/30
3.7K0
数据库连接池学习笔记(一):原理介绍+常用连接池介绍
数据库连接池配置-系统数据库慢排查
1.接下来我们分析数据库,用SHOW FULL PROCESSLIST快照的方式每5秒刷一下进程列表,发现列表这两个语句在长时间运行着,最高有达到80多秒。杀掉之前马上又上来了。可以确定是由于这两个语句长时间查询把连接数占满了。
oktokeep
2025/03/04
2731
c3p0连接池配置模板,SSM中使用c3p0连接池配置属性
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/131947.html原文链接:https://javaforall.cn
全栈程序员站长
2022/06/30
9320
数据库连接池
数据库连接对象是有限资源,所以数据库连接池是用于负责分配、管理和释放数据库连接对象,它允许应用程序重复使用一个现有的数据库连接对象,而不是再重新建立一个;这一点实际上和线程池的概念差不多。数据库连接池会释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏,这项技术能明显提高对数据库操作的性能。
端碗吹水
2020/09/23
1.7K0
数据库连接池
nginx优化之keepalive
1、TCP_NODELAY 你怎么可以强制 socket 在它的缓冲区里发送数据? 一个解决方案是 TCP 堆栈的 TCP_NODELAY选项。这样就可以使缓冲区中的数据立即发送出去。
sunsky
2020/08/20
1.3K0
常用数据库连接池 (DBCP、c3p0、Druid) 配置说明
数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出。对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标。数据库连接池正是针对这个问题提出来的。
用户2409797
2018/08/30
1.8K0
连接池设置
对后台应用程序而言几乎离不开操作数据库,而操作数据库绝对是要跟连接池 pool 打交道的。
凌虚
2020/07/20
1.4K0
连接池设置
最近学习了 HTTP 连接池
6.1大促值班发现的一个问题,一个rpc接口在0~2点用户下单高峰的时候表现rt高(超过1s,实际上针对性优化过的接口rt超过这个值也是有问题的,通常rpc接口里面即使逻辑复杂,300ms应该也搞定了),可以理解,但是在4~5点的时候接口的tps已经不高了,耗时依然在600ms~700ms之间就不能理解了。
芋道源码
2020/02/20
1.6K0
最近学习了 HTTP 连接池
池化技术
池化技术:把一些能够复用的东西(比如说数据库连接、线程)放到池中,避免重复创建、销毁的开销,从而极大提高性能。
用户5325874
2020/04/13
1.2K0
相关推荐
jdbc是数据库连接池么_java的jdbc连接数据库
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档