【MySQL】链接池原理:简单理解网站的数据流动

**前言:**本节内容是博主快速上手mysql专栏的最后一篇文章。 本节内容不讲解mysql语法了, 而是以网站为例,讲一下前后端的逻辑与联系。 友友们可以当成一个故事听。

ps:本节不需要门槛, 当成一个故事听即可!

目录

连接池原理

注册和登录

注册

登录


连接池原理

mysql 其实正常访问的时候,我们把表创建好了之后,下一步其实不是写各种各样的sql。而是基于表结构做开发,写的都是上层的代码。然后我们对应的就需要去连接数据库。而我们每次连接数据库的时候就是,创建MYSQL数据库对象,对他connect,然后用完把数据库关掉。其实就是执行很小部分的sql或者事务后就关掉了,这就是一种短链接

**所以mysql就在网站和数据库之间,有一种编码级别的技术,就叫做连接池。**所谓的连接池怎么去理解,下面我们利用一张图理解一下:

上面这是一个数据库, 就是我们在执行事务或者sql时, 一般都是执行完一个事务, 或者一个sql之后, 就断开连接了。
而实际上我们可以设计一个叫做连接池的小组件,预先让多个线程对mysql建立好链接,建立好连接之后就不动了一直处于连接的状态。后面有任何任务到来就把对应的sql语句push到连接池当中。然后把任务交给连接池当中的线程。这个**线程在被启动的时候一定是给线程绑定或者关联了连接资源。**连接池里面的动作就应该是下面这样:

cpp 复制代码
创建线程池 +MYSQL
启动线程池 +connect
while(true)
{
        //等待拿任务。
}

连接池里面的的数据就是一个一个的我们自己封装的任务。 这个任务里面我们必须要封装sql语句, 也就是sql对应的字符串:

cpp 复制代码
class tack
{
    private:
    string sql;
    function cb;//
};

有了这个task任务类之后, 以后我们想要执行某个sql语句,就是**将想要执行的sql语句写成字符串,然后构建一个task对象,最后把这个task对象push到线程池队列里面。**线程池队列会从队列里面一个一个的拿到task任务,将里面的string类型的sql成员取出来,去访问mysqld。

然后上面有那个cb函数, 这里的cb是什么意思呢? 因为我们的添加删除修改,有时需要把我们的结果拿到。所以如果我们的**cb没有设置,那么就什么都不做;如果cb设置了,就执行select语句,得到结果集res, 然后回调cb函数:cb(res)。**然后我们的数据就被拿回来了!

以上就是连接池小组件大概的逻辑。

注册和登录

注册

我们先看一下用户的注册。利用一张图来理解:

  1. 首先我们一定要先访问网站, 网站然后给我们返回一个注册的界面。
  2. 我们填好各种信息之后, 就点了提交, 这个时候接口就将我们填写的信息提交到了网站的内部。
  3. 网站内部就是用web语言, 比如java, php, python等等语言, 将各个参数提取出来构成sql语句。
  4. 提交到数据库当中, 但是提交到数据库当中太慢,所以就用到了一层软件层。 这个软件层可能是c/c++或者其他的快速的脚本语言写的。
  5. 数据库本身也能够定期进行数据同步, 所以我们的软件层只需要挑选其中一个数据库,将数据写到数据库当中就行了。这样做了之后,网站就不需要关心有多少数据库, 只要在网站和数据块之间添加一层软件层即可。

登录

登录同样可以利用类似于上面的图来理解:

不同的是当网站返回页面的时候, 不是注册页面, 而是登陆页面。 我们同样需要将信息提交。 然后网站内部就执行一个select语句, 就**比如select* from user where user = 'XXX' and passwd = 'XXX'这种。**然后就去查找。 查找到结果后就说明有这个用户, 就能通过。 否则就不能通过。

中间的软件层部分我们也可以添加一些缓存, 类似redis这些数据库。 就是用来保存高热度的数据, 以后去数据库查找之前先到这些缓存里面去找, 查到了就返回。

------------------以上就是本节全部内容哦, 如果对友友们有帮助的话可以关注博主, 方便学习更多知识哦!!!

相关推荐
仍然.1 天前
MYSQL--- 聚合查询,分组查询和联合查询
数据库
一 乐1 天前
校园二手交易|基于springboot + vue校园二手交易系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端
啦啦啦_99991 天前
Redis-0-业务逻辑
数据库·redis·缓存
自不量力的A同学1 天前
Redisson 4.2.0 发布,官方推荐的 Redis 客户端
数据库·redis·缓存
Exquisite.1 天前
Mysql
数据库·mysql
全栈前端老曹1 天前
【MongoDB】深入研究副本集与高可用性——Replica Set 架构、故障转移、读写分离
前端·javascript·数据库·mongodb·架构·nosql·副本集
R1nG8631 天前
CANN资源泄漏检测工具源码深度解读 实战设备内存泄漏排查
数据库·算法·cann
阿钱真强道1 天前
12 JetLinks MQTT直连设备事件上报实战(继电器场景)
linux·服务器·网络·数据库·网络协议
逍遥德1 天前
Sring事务详解之02.如何使用编程式事务?
java·服务器·数据库·后端·sql·spring
笨蛋不要掉眼泪1 天前
Redis哨兵机制全解析:原理、配置与实战故障转移演示
java·数据库·redis·缓存·bootstrap