【MySQL初阶】MySQL连接池原理与简易网站数据流动是如何进行的(初阶完)
一、MySQL连接池1.1、整体架构定位这是一个C 后端服务中的异步 MySQL 连接池设计核心目标是避免每次业务请求都新建 / 销毁 MySQL 连接减少 overhead用线程池 任务队列实现异步 SQL 执行不阻塞业务线程通过回调cb把执行结果传回业务逻辑1.2、模块拆解按图中元素1.2.1. 业务侧左侧函数 A代表你的业务代码比如处理 HTTP 请求、执行delete/insert/update/select等操作的地方。关键行为构造 SQL 语句比如DELETE FROM user WHERE id1把「SQL 语句 结果回调函数」封装成一个Task对象将这个Task推送到连接池的任务队列中然后业务线程可以继续做其他事不用等 SQL 执行完成。1.2.2.class Task任务类这是连接池和业务代码之间的 “数据载体”图里的伪代码是class Task { private: std::string sql; // 要执行的SQL语句 std::functionvoid(Result) cb; // 执行完成后的回调函数 };作用把 ** 要做什么SQL和做完之后要做什么回调** 打包交给连接池线程处理。为什么用std::function因为它可以封装任意可调用对象函数、lambda、成员函数业务侧可以自定义结果处理逻辑。1.2.3. 连接池核心中间模块这是整个设计的核心由两部分组成任务队列Task Queue用来缓存业务侧提交的Task是一个生产者 - 消费者模型业务线程是生产者池内线程是消费者。队列一般需要加锁保护避免多线程竞争问题。线程池 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、整体流程总览这张图完整展示了一个网站从用户发起请求到服务端处理再到数据库交互的完整链路用户端浏览器发起请求访问页面 / 提交表单服务端入口Nginx/Tomcat 处理 HTTP 请求转发给后端程序后端业务层用 C/Java/PHP 等语言处理注册 / 登录逻辑数据库层MySQL 存储用户信息完成校验 / 写入操作2.2、注册流程用户 → 服务器 → 数据库用户端浏览器请求网站 → 服务器返回注册页面用户填写账号、密码等信息通过POST请求提交表单服务器入口Nginx/Tomcat接收POST请求解析表单里的username、password等参数把参数转发给后端业务程序后端业务程序做基础校验检查账号格式、密码长度、账号是否已存在校验通过后给密码加盐并哈希比如用bcrypt生成不可逆的密文向 MySQL 发送INSERT语句写入用户信息账号 哈希后的密码MySQL 数据库执行INSERT语句把用户数据存入表中返回写入结果给后端程序结果返回后端收到 MySQL 成功响应后通过 Nginx 返回给浏览器「注册成功 / 失败」的提示。2.3、登录流程用户 → 服务器 → 数据库 → 会话凭证用户端浏览器请求网站 → 服务器返回登录页面用户输入账号、密码通过POST请求提交表单服务器入口Nginx/Tomcat接收请求解析username、password参数转发给后端业务程序后端业务程序用账号拼接查询 SQL你图里的核心逻辑SELECT * FROM user WHERE userXXX; -- 注意不要直接拼接密码避免SQL注入MySQL 数据库执行查询返回匹配的用户记录包含哈希密码如果没有匹配记录返回空结果后端校验逻辑无结果直接返回「账号不存在」有结果把用户提交的密码做同样的哈希处理和数据库里的密文对比对比失败返回「密码错误」对比成功生成会话凭证Session ID 或 JWT Token结果返回后端把会话凭证写入HttpOnly Cookie通过 Nginx 返回给浏览器。用户后续请求会自动携带这个凭证实现「保持登录状态」。初阶结束兄弟们
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2575682.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!