首页 > 数据库 >利用RAII机制实现了数据库连接池,减少数据库连接建立与关闭的开销,同时实现了用户注册登录功能

利用RAII机制实现了数据库连接池,减少数据库连接建立与关闭的开销,同时实现了用户注册登录功能

时间:2024-03-04 10:34:30浏览次数:16  
标签:用户注册 队列 RAII 数据库 空闲 SqlConnPool 连接 连接池

目录


数据库连接池

数据库连接池(Database Connection Pool)是一种用于管理和共享数据库连接的技术,旨在解决应用程序在高并发场景下频繁创建和销毁数据库连接所带来的性能问题和资源浪费。当应用程序启动或初始化时,数据库连接池预先创建并维护一定数量的数据库连接,并将它们存储在一个容器(比如队列)中。每当应用程序需要与数据库交互时,不是每次都新建一个连接,而是从连接池中取出一个已有的空闲连接来使用;使用完毕后,不是立即关闭这个连接,而是将其归还给连接池,这样其他组件就可以重用此连接。

数据库连接池具有以下优点:

  1. 性能提升:避免了频繁建立和关闭数据库连接造成的延迟和开销。
  2. 资源优化:限制了数据库连接的最大数目,防止过多的连接导致数据库服务器过载。
  3. 更好的并发处理:能够更高效地支持多用户并发访问数据库,尤其是在高并发场景下。
  4. 连接管理:通过配置连接超时时间和最大空闲时间等策略,可以有效管理连接生命周期,避免资源泄露。

数据库连接池的核心功能包括:

  • 初始化时创建连接。
  • 请求时分配连接。
  • 使用完毕后回收连接。
  • 根据配置的策略关闭闲置的连接。
  • 管理连接状态,确保连接的有效性和安全性。

在上述提供的SqlConnPool类中,可以看到它是对数据库连接池的一种具体实现,通过队列、互斥锁和信号量等机制来实现连接的获取、释放和计数等功能。


SqlConnPool

SqlConnPool 类是一个数据库连接池类,其主要功能是管理MySQL数据库连接,避免频繁地创建和销毁连接带来的性能开销。设计上,它采用了单例模式(Singleton)确保在整个程序运行期间只有一个实例存在,并通过一个连接队列(std::queue<MYSQL*> connQue_)来存储预先创建好的数据库连接。

  • 成员变量:

    • MAX_CONN_:表示最大连接数。
    • useCount_:记录当前正在使用的连接数。
    • freeCount_:记录当前空闲的连接数。
    • connQue_:用于存放空闲连接的队列。
    • mtx_:互斥锁,保证对连接队列的操作是线程安全的。
    • semId_:信号量,用于控制并发获取连接的数量。
  • 公共方法:

    • Instance():单例模式的访问方法,返回唯一实例。
    • Init():初始化方法,接受数据库的相关连接参数并创建一定数量的连接放入连接池。
    • GetConn():从连接池中获取一个空闲连接,如果无空闲连接则阻塞等待。
    • FreeConn():将使用完毕的连接归还给连接池。
    • ClosePool():关闭所有连接并清理资源。
    • GetFreeConnCount():返回当前空闲连接的数量。

SqlConnRAII

SqlConnRAII 类是一个基于 RAII(Resource Acquisition Is Initialization)原则实现的类,用于确保从连接池获取的数据库连接在使用完毕后能被正确归还。

类的主要成员变量包括:

  • sql_:指向数据库连接的指针。
  • connpool_:指向 SqlConnPool 实例的指针。

主要方法:

  1. 构造函数:接受一个指向 MYSQL 指针的引用和一个 SqlConnPool 对象的指针,在构造时从连接池中获取一个连接并将指针赋值给 sql_,同时保存连接池实例。
  2. 析构函数:在对象生命周期结束时自动调用,检查是否持有数据库连接,如果有则调用 connpool_->FreeConn() 方法将其归还给连接池,保证了资源的及时释放,避免了手动管理资源时可能出现的忘记释放或异常导致的资源泄露问题。

标签:用户注册,队列,RAII,数据库,空闲,SqlConnPool,连接,连接池
From: https://www.cnblogs.com/yubo-guan/p/18051300

相关文章

  • 数据库SQL行专列和列转行
    行转列适用于按照数据的某个维度的聚合,例如成绩单,按照学生姓名整合各科成绩;列转行适用于拆分某条数据的各属性,例如拆分学生成绩单,按名称、学科、成绩展示;行转列方法:通常使用聚合函数对数据进行处理,例如sum、max、count等SELECTuser_name,MAX(CASEcourseWHEN'数学'T......
  • 断电引起文件scn异常数据库恢复---惜分飞
    联系:手机/微信(+8617813235971)QQ(107644445)标题:断电引起文件scn异常数据库恢复作者:惜分飞©版权所有[未经本人同意,不得以任何形式转载,否则有进一步追究法律责任的权利.]由于异常断电,数据库最初启动报错FriMar0108:41:172024ALTERDATABASE  MOUNTSucces......
  • 数据库性能调优
    一、数据库设计优化数据库设计是影响数据库性能的重要因素之一。在数据库设计时,应该尽量避免冗余数据、过度规范化和设计过于复杂的数据模型。以下是几个数据库设计优化的建议:1、避免冗余数据对于数据中重复的信息,应该将其拆分到单独的表中,以便提高数据的一致性和更新的效率。......
  • 常见的数据库语句解析
    创建表的时候,一般都会在结尾写上这些代码:ENGINE=InnoDBAUTO_INCREMENT=70defaultcharset=utf8mb3collate=utf8mb4_bincomment='';我经过学习后简单了解了这些语句的作用:ENGINE=InnoDB:指定了表的存储引擎为InnoDB,InnoDB是MySQL的一种存储引擎,提供了事务处理和外......
  • MySQL之初识数据库
    linux安装更新YUM源:sudorpm-Uvhhttps://dev.mysql.com/get/mysql80-community-release-el7-7.noarch.rpm安装MySQL:sudoyum-yinstallmysql-community-server--enablerepo=mysql80-community--nogpgcheck启动数据库netstartmysql或者sudosystemctlstartmysq......
  • MySQL之MySQL数据库安装
    了解各种服务器的端口MySQL:3306Redis:6379MongoDB:27017Django:8000flask:5000MySQL介绍MySQL是一个关系型数据库管理系统,由瑞典MySQLAB公司开发,目前属于Oracle旗下公司。MySQL最流行的关系型数据库管理系统,在WEB应用方面MySQL是最好的RDBMS(RelationalDa......
  • 学习随笔数据库
    SQL基本操作CREATETABLEt_book(idINT,NAMEVARCHAR(20),authorVARCHAR(10),priceDOUBLE);--查询数据select*fromt_book;--增加元素INSERTINTOt_book(id,name,author,price)VALUES(1,'三体','刘慈欣',99.9);INSERTINTOt_book(id,name......
  • spring boot ems案例用户注册功能
    用户注册功能部分代码:实体类:packagecom.baizhi.entity;publicclassUser{privateIntegerid;privateStringusername;privateStringrealname;privateStringpassword;privateBooleangender;publicIntegergetId(){ret......
  • PostgreSQL、KingBase 数据库 ORDER BY LIMIT 查询缓慢案例
    好久没写博客了,最近从人大金仓离职了,新公司入职了蚂蚁集团,正在全力学习 OcenaBase 数据库的体系结构中。以后分享的案例知识基本上都是以OcenaBase分布式数据库为主了,呦西。......
  • scrapy——分别存储在文本文件和mysql数据库中
    笔记如何将爬取到的数据一份存储到本地一份存储到数据库?-创建一个管道类-爬虫文件提交到的item指挥给管道文件中的第一个被执行的管道类接收-process_item方法中的returnitem表示将item提交给下一个管道类在pipelines类中加入MysqlPiplines类#Defineyour......