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

MySQL连接池原理与网站数据流动(了解)

目录

一、MySQL连接池原理

1、什么是数据库连接池?

2、为什么需要连接池?(没有连接池的问题)

问题所在

3、连接池的核心原理与工作流程

工作流程

连接管理(连接池的守护任务)

4、核心参数详解

5、流行的Java连接池实现

二、简易网站数据流动是如何进行

阶段一:从用户到服务器(前端 -> 后端)

阶段二:服务器内部处理(后端逻辑)

阶段三:从服务器到用户(后端 -> 前端)

三、总结与关联


一、MySQL连接池原理

1、什么是数据库连接池?

        简单来说,连接池就是一个“缓存”了数据库连接的容器。当应用程序需要与数据库交互时,它不再需要重新建立一个连接,而是直接从池中“借用”一个已经建立好的空闲连接。使用完毕后,应用程序将连接“归还”给池子,而不是真正关闭它,以供后续请求重复使用。

2、为什么需要连接池?(没有连接池的问题)

在没有连接池的时代,应用程序处理数据库请求的流程是:

1. 建立连接:通过TCP三次握手、MySQL认证、权限验证等步骤,创建一个数据库连接。这是一个昂贵的操作,消耗CPU、内存资源和网络带宽,并且非常耗时(通常是几十到几百毫秒)。

2. 执行SQL:通过这个连接执行数据查询或更新操作。

3. 关闭连接:操作完成后,断开连接,释放资源。

问题所在

        对于高并发的网站,每一秒可能有成千上万的请求。如果每个请求都经历一次“创建连接-关闭连接”的过程,数据库服务器会不堪重负,大部分资源都浪费在建立和断开连接上,而不是处理真正的业务SQL,导致系统性能急剧下降,响应缓慢。

3、连接池的核心原理与工作流程

连接池充当了应用程序和数据库之间的一个“中间人”,其核心原理是 “连接复用”

工作流程

1. 初始化:当应用程序启动时,连接池会根据配置(如初始连接数 initialSize=5)创建一定数量的数据库连接,并将它们放入池中备用。

2. 获取连接

  • 当应用程序需要访问数据库时,它向连接池请求一个连接。

  • 连接池会检查池中是否有空闲的、可用的连接。

    • 如果有:直接将该连接分配给应用程序。

    • 如果没有

      • 检查当前连接数是否已达到最大连接数上限(maxActive=20)。

      • 如果没达到,则新建一个连接给应用程序。

      • 如果已达到,则请求会进入等待队列,直到有其他连接被释放或等待超时。

3. 使用连接:应用程序使用获取到的连接执行SQL语句。

4. 归还连接:SQL执行完毕后,应用程序调用 connection.close() 方法。注意:在连接池环境下,这个方法并不会真正关闭物理连接,而只是通知连接池“这个连接我用完了,请回收”。连接池会将此连接状态置为空闲,放回池中,等待下一次被分配。

连接管理(连接池的守护任务)

连接池不仅仅是 passively 地分配连接,它还主动管理连接的健康和有效性:

  • 空闲连接回收:如果池中的空闲连接超过一定时间(minEvictableIdleTimeMillis)未被使用,池会真正关闭它们以节省资源。

  • 活性检查:定期向数据库发送一个简单的查询(如 SELECT 1)来验证空闲连接是否仍然有效。如果数据库重启,某些连接会失效,连接池能检测到并重新建立连接。

  • 最大空闲数/最小空闲数控制:动态调整池中空闲连接的数量,使其维持在一个合理的范围内(minIdlemaxIdle)。

4、核心参数详解

  • initialSize:连接池启动时创建的初始连接数。

  • maxActive:连接池中同时能存在的最大活动连接数。这是控制数据库并发负载的关键参数。

  • minIdle:连接池中允许的最小空闲连接数。低于此数值,池会创建新的连接。

  • maxIdle:连接池中允许的最大空闲连接数。超过此数值的空闲连接将被释放。

  • maxWait:当连接池无可用连接时,应用程序请求连接的最大等待时间(毫秒),超时则抛出异常。

5、流行的Java连接池实现

  • HikariCP:以高性能著称,是目前最流行的选择。

  • Druid:阿里巴巴开源项目,除了连接池功能,还提供了强大的监控和统计功能。


二、简易网站数据流动是如何进行

我们以一个用户在你的网站 www.example.com 上搜索“智能手机”为例,来分解数据的完整流动过程。这个过程通常被称为 “请求-响应循环”

阶段一:从用户到服务器(前端 -> 后端)

1. 用户触发动作:用户在浏览器搜索框中输入“智能手机”并点击“搜索”按钮。

2. 浏览器准备并发送HTTP请求

  • 构建请求:浏览器根据表单或JavaScript代码,构建一个HTTP请求。

    • URLhttps://www.example.com/search?keyword=智能手机

    • 方法GET (如果是登录等操作,可能是 POST)

    • Headers: 包含Cookie(会话信息)、User-Agent(浏览器信息)等。

  • DNS解析:浏览器不知道 www.example.com 的IP地址,于是向DNS服务器查询,获取到网站服务器的实际IP地址(如 192.0.2.1)。

  • 建立TCP连接:浏览器通过TCP三次握手,与服务器IP地址的80端口(HTTP)或443端口(HTTPS)建立连接。如果是HTTPS,还会进行TLS握手以加密通信。

  • 发送请求:通过已建立的连接,将准备好的HTTP请求报文发送给服务器。

阶段二:服务器内部处理(后端逻辑)

服务器(如Nginx + Tomcat + Spring Boot + MySQL架构)接收到请求后,开始内部接力:

3. Web服务器接收(Nginx)

  • Nginx作为反向代理和Web服务器,首先接收到请求。

  • 它可能会直接处理一些静态资源请求(如图片、CSS、JS文件),并立即返回,不再向后传递。

  • 对于动态请求(如 /search),Nginx根据配置,将请求转发给后端的应用服务器(如Tomcat)。

4. 应用服务器处理(Tomcat + Spring Boot)

  • Tomcat 接收到转发来的请求,它是一个Servlet容器。

  • 解析请求:Tomcat解析HTTP请求,将其转换为Java Servlet的 HttpServletRequest 对象。

  • 分发给控制器:根据URL路径(/search),通过Spring MVC等框架,将请求路由到对应的 SearchController 类中的处理方法。

  • 执行业务逻辑

    • 获取参数:控制器从请求中获取 keyword 参数(“智能手机”)。

    • 调用服务层:控制器调用 ProductService.search(keyword) 方法。

    • 访问数据库

      • ProductService 向连接池请求一个数据库连接。

      • 通过连接执行SQL:SELECT * FROM products WHERE name LIKE ‘%智能手机%’

      • 连接池提供一个可用的MySQL连接。

      • MySQL服务器执行查询,返回结果集。

      • Service层接收到数据,进行业务逻辑处理(如排序、过滤)。

    • 封装数据:将处理后的商品列表数据封装成Java对象(Model)。

5. 生成响应

  • 控制器将数据(Model)传递给视图模板引擎(如Thymeleaf, FreeMarker)。

  • 模板引擎将数据填充到HTML模板中,生成最终的、包含“智能手机”搜索结果的完整HTML页面。

  • 这个HTML内容被设置为HTTP响应体。

阶段三:从服务器到用户(后端 -> 前端)

6. 返回HTTP响应:应用服务器(Tomcat)将生成的HTML内容封装成HTTP响应(状态码200 OK,Headers,Body为HTML),通过Nginx发回给用户的浏览器。

7. 浏览器渲染

  • 浏览器接收到HTTP响应。

  • 解析HTML:开始解析HTML代码,构建DOM树。

  • 加载资源:如果HTML中引用了CSS、JavaScript或图片,浏览器会再次向服务器发起请求获取这些资源。

  • 应用样式与脚本:结合CSS构建渲染树,执行JavaScript,最终将完整的、可视化的页面呈现给用户。

8. 用户看到结果:用户看到了一个显示着各种智能手机商品列表的页面。


三、总结与关联

  • MySQL连接池 是数据流动过程中,在阶段二(服务器内部处理) 的“访问数据库”环节发挥关键作用的组件。它通过复用连接,极大地提升了这个环节的效率,从而支撑了整个网站的高并发数据流动。

  • 网站数据流动 是一个贯穿前端、网络、后端、数据库的完整链条,理解这个链条有助于你定位问题(是前端问题?网络问题?还是数据库慢了?)和进行系统优化。

http://www.dtcms.com/a/457047.html

相关文章:

  • Hadess入门到实战(8) - 如何管理Go制品
  • 最短路径问题总结
  • 建设银行网站为什么登不上门头设计
  • NX543NX551美光SSD固态闪存NX552NX564
  • 倍增:快速幂
  • 网站关键词快速排名工具网站建设项目可行性分析
  • 开源AI智能名片链动2+1模式S2B2C商城小程序在现代营销运营中的应用与实践
  • 自然语言处理分享系列-词向量空间中的高效表示估计(二)
  • 开发Bug——U盘插入断网
  • 开源 C++ QT QML 开发(十)通讯--串口
  • BMS(电池管理系统)的主要功能和架构简述
  • asp业务网站视频链接生成器
  • Flask模板中使用React、ant-design、@ant-design/icons示例模板
  • 站长源码之家网络营销中常用的营销策略
  • JAVA算法练习题day35
  • 德州做网站施工企业准则
  • 深圳网站建设十强河北省城乡住房和城乡建设厅网站
  • 数字增量式编码器:工业自动化的“精密神经元”
  • Spring AI-流式编程
  • 手写 Promise.all 的原理与实现
  • 关于windows系统事件查看器的初步理解
  • Linux 线程概念与虚拟地址空间深度解析
  • 一套智慧工地云平台源码,支持监管端、项目管理端,Java+Spring Cloud +UniApp +MySql技术开发
  • 虚幻引擎5 GAS开发俯视角RPG游戏 P05-05 游戏效果委托
  • 音频audio播放两种方式:MediaPlayer和AudioTrack对比
  • K8s学习笔记(十五) pause容器与init容器
  • DVWA靶场之十六:未验证的重定向漏洞(Open HTTP Redirect)
  • 上海网站建设免费推做网站的软件 简单易学
  • 面部情绪识别数据集的介绍和下载
  • Golang中的HTTP请求凝聚器