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

【MySQL初阶】MySQL连接池原理与简易网站数据流动是如何进行的(初阶完)

一、MySQL连接池

1.1、整体架构定位

这是一个C++ 后端服务中的异步 MySQL 连接池设计,核心目标是:

  • 避免每次业务请求都新建 / 销毁 MySQL 连接(减少 overhead)
  • 用线程池 + 任务队列实现异步 SQL 执行,不阻塞业务线程
  • 通过回调(cb)把执行结果传回业务逻辑

1.2、模块拆解(按图中元素)

1.2.1. 业务侧(左侧:函数 A)

  • 代表你的业务代码,比如处理 HTTP 请求、执行delete/insert/update/select等操作的地方。
  • 关键行为:
    1. 构造 SQL 语句(比如DELETE FROM user WHERE id=1
    2. 把「SQL 语句 + 结果回调函数」封装成一个Task对象
    3. 将这个Task推送到连接池的任务队列中,然后业务线程可以继续做其他事,不用等 SQL 执行完成。

1.2.2.class Task任务类

这是连接池和业务代码之间的 “数据载体”,图里的伪代码是:

class Task { private: std::string sql; // 要执行的SQL语句 std::function<void(Result)> cb; // 执行完成后的回调函数 };

  • 作用:把 ** 要做什么(SQL)做完之后要做什么(回调)** 打包,交给连接池线程处理。
  • 为什么用std::function?因为它可以封装任意可调用对象(函数、lambda、成员函数),业务侧可以自定义结果处理逻辑。

1.2.3. 连接池核心(中间模块)

这是整个设计的核心,由两部分组成:

  1. 任务队列(Task Queue)

    • 用来缓存业务侧提交的Task,是一个生产者 - 消费者模型:业务线程是生产者,池内线程是消费者。
    • 队列一般需要加锁保护,避免多线程竞争问题。
  2. 线程池 + MySQL 连接:图里的伪代码逻辑是:

// 初始化阶段 创建线程池 为每个线程创建一个 MySQL 连接并初始化 启动线程池 // 线程的主循环 while (true) { 从任务队列取出一个 Task 用当前线程持有的 MySQL 连接执行 SQL 获取执行结果 Result 调用 Task 里的回调函数 cb(res) }
  • 每个线程持有一个长期复用的 MySQL 连接,避免反复创建连接的开销。
  • 线程循环从队列里取任务,处理完一个再取下一个,连接不会被频繁创建销毁。
  • 图里的mysqld是 MySQL 服务端,线程池里的每个连接都是和mysqld建立的长连接。

1.2.4. 回调与结果回传(cb(res)

  • 当连接池线程执行完 SQL,拿到结果(比如查询结果集、受影响行数、错误信息等)后,会调用Task里的cb(res)回调函数。
  • 回调函数里会把结果传回业务侧的函数A,业务线程就可以拿到 SQL 执行结果,做后续处理(比如返回 HTTP 响应、更新业务状态等)。

二、用户逻辑怎么走

2.1、整体流程总览

这张图完整展示了一个网站从用户发起请求,到服务端处理,再到数据库交互的完整链路:

  1. 用户端:浏览器发起请求(访问页面 / 提交表单)
  2. 服务端入口:Nginx/Tomcat 处理 HTTP 请求,转发给后端程序
  3. 后端业务层:用 C++/Java/PHP 等语言处理注册 / 登录逻辑
  4. 数据库层:MySQL 存储用户信息,完成校验 / 写入操作

2.2、注册流程(用户 → 服务器 → 数据库)

  1. 用户端

    • 浏览器请求网站 → 服务器返回注册页面
    • 用户填写账号、密码等信息,通过POST请求提交表单
  2. 服务器入口(Nginx/Tomcat)

    • 接收POST请求,解析表单里的usernamepassword等参数
    • 把参数转发给后端业务程序
  3. 后端业务程序

    • 做基础校验:检查账号格式、密码长度、账号是否已存在
    • 校验通过后,给密码加盐并哈希(比如用bcrypt),生成不可逆的密文
    • 向 MySQL 发送INSERT语句,写入用户信息(账号 + 哈希后的密码)
  4. MySQL 数据库

    • 执行INSERT语句,把用户数据存入表中
    • 返回写入结果给后端程序
  5. 结果返回:后端收到 MySQL 成功响应后,通过 Nginx 返回给浏览器「注册成功 / 失败」的提示。

2.3、登录流程(用户 → 服务器 → 数据库 → 会话凭证)

  1. 用户端

    • 浏览器请求网站 → 服务器返回登录页面
    • 用户输入账号、密码,通过POST请求提交表单
  2. 服务器入口(Nginx/Tomcat)

    • 接收请求,解析usernamepassword参数
    • 转发给后端业务程序
  3. 后端业务程序

    • 用账号拼接查询 SQL(你图里的核心逻辑):

SELECT * FROM user WHERE user='XXX'; -- 注意:不要直接拼接密码,避免SQL注入

  • MySQL 数据库

    • 执行查询,返回匹配的用户记录(包含哈希密码)
    • 如果没有匹配记录,返回空结果
  • 后端校验逻辑

    • 无结果:直接返回「账号不存在」
    • 有结果:把用户提交的密码做同样的哈希处理,和数据库里的密文对比
      • 对比失败:返回「密码错误」
      • 对比成功:生成会话凭证(Session ID 或 JWT Token)
  • 结果返回:后端把会话凭证写入HttpOnly Cookie,通过 Nginx 返回给浏览器。用户后续请求会自动携带这个凭证,实现「保持登录状态」。

初阶结束兄弟们!!!

http://www.jsqmd.com/news/739458/

相关文章:

  • 创业团队如何借助Taotoken统一API降低多模型试错与接入成本
  • GD32F103虚拟串口(CDC)移植避坑指南:从Demo到实用项目的关键三步
  • 第九章-04-Python模块的导入
  • 深入解析STM32存储器架构与总线系统
  • Stein《复分析》第一章精读笔记:从“荒谬”的负数平方根到Cauchy定理的引子
  • AI时代,如何保持深度思考的能力
  • 什么是中间人攻击
  • AI推理时代的逻辑重构
  • 拯救C盘!手把手教你将Anaconda虚拟环境安装到其他盘(附权限问题解决)
  • 2026年哪些平台可以购买积存金?主流渠道对比参考 - 品牌排行榜
  • 为 Hermes Agent 自定义 LLM 提供商并接入 Taotoken 的配置指南
  • R3nzSkin皮肤注入工具:5步轻松实现英雄联盟皮肤自定义
  • 如何用PyTorch自动微分快速构建科学计算模型:从理论到实践的完整指南 [特殊字符]
  • Obsidian Zettelkasten终极指南:30天打造高效个人知识库系统
  • 2026南京男士假发定制天花板?世晨非凡男士假发定制(南京金轮国际店)实测:4秒佩戴 + 隐形无痕,这效果绝了! - 律界观察
  • 电商订单数据分析实战:基于SQL的全流程业务挖掘
  • 暗黑破坏神2存档编辑器终极指南:3分钟快速上手修改你的游戏角色
  • 告别轮询!在Linux上用select实现高效串口中断接收(附i.MX6ULL实测代码)
  • 别再手画流程图了!用PlantUML 5分钟搞定产品需求文档里的用例图
  • OneNote高手都在用的‘隐藏’操作:用键盘搞定表格、大纲和页面管理(Windows版)
  • 【仅限机构订阅的优化清单】:Linux实时调度+CPU隔离+RDT技术在Python交易引擎中的军工级落地
  • 一步到位!OpenClaw 全自动部署教程(附下载链接+问题排查)
  • 对比直接使用原生 API 与通过 Taotoken 聚合调用的便捷性差异
  • xss的介绍
  • LLM驱动的硬件木马攻防新范式解析
  • Spring 框架 05:Spring AOP 配置文件方式详解
  • 通过官方价折扣与活动价降低大模型api的长期使用成本
  • 如何用Keyviz免费工具让键盘鼠标操作一目了然?完整指南
  • 别急着装Kubuntu!在Ubuntu上保留GNOME的同时体验KDE Plasma(双桌面共存指南)
  • 新手也会的 Win10 OpenClaw 一键部署