TinyWebServer学习笔记-MySQL数据库连接

为什么要用数据库连接池?

我们的网站允许用户注册,在没有池的情况下,假设只有一个人,那么流程就是,用户点击注册,通过socket将用户的账号和密码发送到服务器,然后就需要创建MySQL数据库连接,然后插入数据,插入完毕后销毁该连接;然而当用户很多时,这个设计就会花费大量的时间在数据库连接的创建和释放上。为了避免这种情况,引入池的概念,在程序初始化的时候,集中建立多个数据库连接,并集中管理,供程序使用,更见安全和可靠。

池是一组资源的机会,这组资源在服务器启动之初就被完全创建好并初始化,池是资源的容器,实现对资源的复用。是一种用空间换时间的技术。当系统开始处理客户请求的时候,如果需要相关资源,直接从池中获取,无需动态分配,当服务器处理完一个客户连接口,将相关资源放回池中,无需执行系统调用来释放资源。

如何设计?

class connection_pool
{
public:MYSQL *GetConnection();				 //获取数据库连接bool ReleaseConnection(MYSQL *conn); //释放连接int GetFreeConn();					 //获取连接void DestroyPool();					 //销毁所有连接//单例模式static connection_pool *GetInstance();void init(string url, string User, string PassWord, string DataBaseName, int Port, int MaxConn, int close_log); private:connection_pool();~connection_pool();int m_MaxConn;          //最大连接数int m_CurConn;          //当前已使用的连接数int m_FreeConn;         //当前空闲的连接数locker lock;            //互斥锁list<MYSQL *> connList; //连接池sem reserve;public:string m_url;			 //主机地址string m_Port;		     //数据库端口号string m_User;		     //登陆数据库用户名string m_PassWord;	     //登陆数据库密码string m_DatabaseName;   //使用数据库名int m_close_log;	     //日志开关
};

在init函数中完成了对各个数据库连接的初始化,并将连接存储到list中,

void connection_pool::init(string url, string User, string PassWord, string DBName, int Port, int MaxConn, int close_log)
{m_url = url;m_Port = Port;m_User = User;m_PassWord = PassWord;m_DatabaseName = DBName;m_close_log = close_log;for (int i = 0; i < MaxConn; i++){MYSQL *con = NULL;con = mysql_init(con);if (con == NULL){LOG_ERROR("MySQL Error");exit(1);}con = mysql_real_connect(con, url.c_str(), User.c_str(), PassWord.c_str(), DBName.c_str(), Port, NULL, 0);if (con == NULL){LOG_ERROR("MySQL Error");exit(1);}connList.push_back(con);++m_FreeConn;}reserve = sem(m_FreeConn);m_MaxConn = m_FreeConn;
}

下面是从池中获取一个连接的函数:

bool connection_pool::ReleaseConnection(MYSQL *con)
{if (NULL == con)return false;lock.lock();connList.push_back(con);++m_FreeConn;--m_CurConn;lock.unlock();reserve.post();return true;
}

可以看到,先调用wait函数,reserve是信号量,如果值>=1,那么将值-1,如果为0就会陷入阻塞。成功获得信号量后,获得互斥锁,然后将池中的list的头取出来,更新相关的数据后释放锁。

释放连接时也是类似的,上锁,然后将连接添加进池中,更新数据后释放锁。

而作者为了实现池的RAII,设计了connectionRAII类:

class connectionRAII{public:connectionRAII(MYSQL **con, connection_pool *connPool);~connectionRAII();private:MYSQL *conRAII;connection_pool *poolRAII;
};

需要说明,由于数据库连接本身就是指针,因此通过有参构造对传入的参数进行修改时需要用双指针。

如图所示,*A的值是0x00000004;*B的值是C的实际内容,那么也就是说*A之后得到0x00000008是实际资源的地址,现在还要"解引用"一次才能得到实际值。

下面的代码是获得池中的一个连接以及将连接还回去的代码。

connectionRAII::connectionRAII(MYSQL **SQL, connection_pool *connPool){*SQL = connPool->GetConnection();conRAII = *SQL;poolRAII = connPool;
}connectionRAII::~connectionRAII(){poolRAII->ReleaseConnection(conRAII);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/93576.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Unity]未能加载一个或多个断点问题

【背景】 大家2023国庆快乐&#xff0c;虽然是假期&#xff0c;我还是继续码些文章。 今天写项目时遇到个环境问题&#xff0c;新建脚本时双击调起VS编辑器&#xff0c;忽然提示无法加载一个或多个断点&#xff08;当时忘记截图了&#xff0c;现在已解决&#xff0c;就不上图了…

【Linux】文件权限详解

&#x1f341; 博主 "开着拖拉机回家"带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——&#x1f390;开着拖拉机回家_Linux,Java基础学习,大数据运维-CSDN博客 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341; 希望本文能够给您带来一定的…

Go: 关于定时任务

文章目录 写在前面内容基础库for sleepTicker 第三方库cron安装表达式linux cron 表达式jobschedule 参考 写在前面 记录 Go 的一些关于定时任务的处理 内容 基础库 for sleep func main() {for {time.Sleep(5 * time.Second)fmt.Println("every 5s")} }Ticke…

使用Docker部署ElasticSearch7+ELK(附带ES操作操作命令集)

ElasticSearch 7ELK 程序安装Docker安装下载ES镜像提前创建挂载文件夹添加配置文件创建并启动容器可能出现的异常安装IK分词使用ElasticHD客户端工具(目前使用发现无法做增删改)安装Kibana 软件包安装安装ElasticSearch&#xff08;需要JDK1.8&#xff09;安装IK&#xff08;下…

TS系列之typeof

TS系列之typeof 这里写目录标题 前言回顾&#xff1a;Js中typeof的用法1、typeof的返回类型有哪些 Ts 中的 typeof 运算符作为类型判断的工具什么是 typeof&#xff1f;类型保护与条件类型复杂类型 总结 前言 今天总结一下typeof相关的知识。 typeof在Js中也是常用来判断变量…

来看看双阶段目标检测算法趴

&#x1f680; 作者 &#xff1a;“码上有钱” &#x1f680; 文章简介 &#xff1a;AI-目标检测算法 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac;简介 双阶段目标检测算法是一类深度学习算法&#xff0c;通常分为两个阶段来检测和识别图像中的…

【时区】Flink JDBC 和CDC时间字段时区 测试及时间基准

关联文章: 各种时间类型和timezone关系浅析 一、测试目的和值 1. 测试一般的数据库不含time zone的类型的时区。 mysql timestamp(3) 类型postgres timestamp(3) 类型sqlserver datetime2(3) 类型oracle类型 TIMESTAMP(3) 类型 在以下测试之中均为ts字段 2.测试CDC中元数据…

【数据结构】堆的应用-----TopK问题

目录 一、前言 二、Top-k问题 &#x1f4a6;解法一&#xff1a;暴力排序 &#x1f4a6;解法二&#xff1a;建立N个数的堆 &#x1f4a6;解法三&#xff1a;建立K个数的堆&#xff08;最优解&#xff09; 三、完整代码和视图 四、共勉 一、前言 在之前的文章中&#xff…

【Kubernetes】当K8s出现问题时,我们可以从哪些方面排查出

前言 kubernetes&#xff0c;简称K8s&#xff0c;是用8代替名字中间的8个字符“ubernete”而成的缩写。是一个开源的&#xff0c;用于管理云平台中多个主机上的容器化的应用&#xff0c;Kubernetes的目标是让部署容器化的应用简单并且高效&#xff08;powerful&#xff09;,Kub…

python中dir()和help()的作用

在 Python 中&#xff0c;dir() 和 help() 是两个常用的内置函数&#xff0c;用于获取对象的属性和方法信息以及提供帮助文档。 dir(object) 函数返回一个包含对象 object 的属性和方法名称的列表。如果没有提供参数&#xff0c;则返回当前作用域内的所有名称。例如&#xff0…

善于拆约束条件+合并相关项+DS维护:0928T2

http://cplusoj.com/d/senior/p/SS230928B 老套路了 考虑枚举0和2 m j m i n ( f a m − g a j , f b m − g b j ) \large mjmin(fa_m-ga_j,fb_m-gb_j) mjmin(fam​−gaj​,fbm​−gbj​) 然后拆一下min&#xff0c;再分情况讨论一下&#xff0c;移项合并相同的 以其中一…

DAMA-DMBOK2重点知识整理CDGA/CDGP——第14章 大数据与数据科学

目录 一、分值分布 二、重点知识梳理 1、引言 1.1 业务驱动因素 1.2 原则 1.3 基本理念 2、活动 2.1 定义大数据战略和业务需求 2.2 选择数据源 2.3 获得和接收数据源 2.4 制定数据假设和方法 2.5 集成和调整数据进行分析 2.6 使用模型探索数据 2.7 部署和监控 …

Linux CentOS7 vim多文件与多窗口操作

窗口是可视化的分割区域。Windows中窗口的概念与linux中基本相同。连接xshell就是在Windows中新建一个窗口。而vim打开一个文件默认创建一个窗口。同时&#xff0c;Vim打开一个文件也就会建立一个缓冲区&#xff0c;打开多个文件就会创建多个缓冲区。 本文讨论vim中打开多个文…

[Java框架] Java常用爬虫框架推荐

Selenium GitHub 截止 2023年9月份 Star数量27.7K Selenium是一款基于浏览器自动化的工具&#xff0c;它可以模拟用户在浏览器上的操作行为&#xff0c;并获取网页上的内容。Selenium支持多种浏览器&#xff0c;可以很好地处理JavaScript生成内容。但是Selenium相较于其他框架而…

【单片机】14-I2C通信之EEPROM

1.EEPROM概念 1.EEPROM 1.1 一些概念 &#xff08;1&#xff09;一些概念&#xff1a;ROM【只读存储器---硬盘】&#xff0c;RAM【随机访问存储器--内存】&#xff0c;PROM【可编程的ROM】&#xff0c;EPROM【可擦除ROM】&#xff0c;EEPROM【电可擦除ROM】 1.2 为什么需要EE…

应用大五人格测试,来做个人职业规划

应用大五人格测试做职业规划&#xff0c;一方面能让大学生清楚知晓自己的性格特征&#xff0c;置身适合怎样的职业&#xff0c;让他们结合自己的兴趣爱好职业走向&#xff0c;进一步了解自己适合做的职业规划。另一方面可以帮助他们结合职业规划来安排人生&#xff0c;一步一个…

Transformer学习-self-attention

这里写自定义目录标题 Self-attentionMulti-head self-attention用self-attention解决其他问题 Self-attention 用Wq、Wk、Wv分别乘输入向量得到q、k、v向量 用每个q向量乘所有的k向量得到对应项的attention&#xff0c;即用每项的query向量去匹配所有的key向量&#xff0c;得…

【进阶C语言】自定义类型

本节内容大致目录如下&#xff1a; 1.结构体 2.位段 3.枚举 4.联合&#xff08;共用体&#xff09; 以上都是C语言中的自定义类型&#xff0c;可以根据我们的需要去定义。 一、结构体 一些基础知识在初阶C语言的时候已经介绍过&#xff0c;在这里粗略概括&#xff1b;重…

代码随想录算法训练营第五十五天 | 动态规划 part 12 | 300.最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组

目录 300.最长递增子序列思路代码 674. 最长连续递增序列思路代码 718. 最长重复子数组思路代码 300.最长递增子序列 Leetcode 思路 dp[i]表示i之前包括i的以nums[i]结尾的最长递增子序列的长度递推公式&#xff1a;if (nums[i] > nums[j]) dp[i] max(dp[i], dp[j] 1)初…

面试总结之Spring篇

一、AOP 1、什么是AOP 1.1、概述 AOP&#xff08;Aspect-Oriented Programming&#xff09;&#xff1a;面向切面编程&#xff0c;即把一些业务逻辑中的相同代码抽取出来&#xff0c;让业务逻辑更加简练清爽 如果要CRUD写一堆业务&#xff0c;可如何实现业务代码前后进行打印…