首页 > 数据库 >C++_手写数据库连接池

C++_手写数据库连接池

时间:2023-09-05 17:11:27浏览次数:44  
标签:数据库 ConnectionPool C++ Connection 线程 手写 连接 连接池

C++_手写数据库连接池

关键技术点

MySQL数据库编程、单例模式、queue队列容器、C++11多线程编程、线程互斥、线程同步通信和 unique_lock、基于CAS的原子整形、智能指针shared_ptr、lambda表达式、生产者-消费者线程模型

连接池的主要功能点

  1. 单例模式:因为连接池只需要一个实例

  2. 从ConnectionPool中可以获取和MySQL的连接Connection

  3. 空闲连接Connection全部维护在一个线程安全的Connection队列中,使用线程互斥锁保证队列的线程安全

  4. 如果Connection队列为空,还需要再获取连接,此时需要动态创建连接,上限数量是maxSize

  5. 队列中空闲连接时间超过maxIdleTime的就要被释放掉,只保留初始的initSize个连接就可以了,这个功能点可定需要放在独立的线程中去做

  6. 如果Connection队列为空,而此时连接的数量已达到上限maxSize,那么等待connectionTineout时间,如果还获取不到空闲的连接,那么获取连接失败,此处从Connection队列获取空闲连接,可以使用带超时时间的mutex互斥锁来实现连接超时时间

  7. 用户获取的连接用shared_ptr智能指针来管理,用lambda表达式定制连接释放的功能(不真正释放连接,而是把连接归还到连接池中)

  8. 连接的生产和连接的消费采用生产者-消费者线程模型来设计,使用了线程间的同步通信机制条件变量和互斥锁

核心代码分享

ConnectionPool.cpp和 ConnectionPool.h:连接池代码实现 

Connection.cpp和 Connection.h:数据库操作代码、增删改查代码实现

 

构造函数私有化,提供一个 getConnectionPool接口来构造唯一的数据库连接池
getConnectionPool 是一个线程安全的懒汉单例函数接口
ConnectionPool* ConnectionPool::getConnectionPool()
{
static ConnectionPool pool; // lock和unlock
return &pool;
}

 

将数据库连接需要的ip、port、username、password、dbname等封装到了mysql.ini文件中
bool loadConfigFile(); 这个接口可以从配置文件中加载配置项

 

ConnectionPool::ConnectionPool()构造函数中,创建2个线程,一个用于连接生产者,另一个用于定时扫描超时,进行对于超时的连接回收。
   // 启动一个新的线程,作为连接的生产者 linux thread => pthread_create
thread produce(std::bind(&ConnectionPool::produceConnectionTask, this));
produce.detach();

// 启动一个新的定时线程,扫描超过maxIdleTime时间的空闲连接,进行对于的连接回收
thread scanner(std::bind(&ConnectionPool::scannerConnectionTask, this));
scanner.detach();
将这两个线程detach,从主线程分离

测试结果

使用带连接池的数据库访问 比 使用普通的数据库访问操作 大约用时少50%

(模拟多个用户1000+同时接入数据库的情况)

标签:数据库,ConnectionPool,C++,Connection,线程,手写,连接,连接池
From: https://www.cnblogs.com/espgod/p/17680194.html

相关文章

  • C++ 算法竞赛、01 周赛篇 | AcWing 第1场周赛
    AcWing第1场周赛竞赛-AcWing3577选择数字3577.选择数字-AcWing题库朴素暴力两层循环#include<cstdio>#include<iostream>#include<unordered_set>usingnamespacestd;constintN=101;inta[N],b[N];intmain(){intn,m;cin>>n;......
  • 将Python深度神经网络转换成C++
     项目方案:将Python深度神经网络转换成C++项目概述本项目旨在将使用Python编写的深度神经网络模型转换为C代码,以便在C环境中部署和运行。通过将模型从Python转换为C++,可以提高模型的性能和效率,并扩展模型在不同平台和设备上的应用。技术方案1.选择转换工具我们可以使用以下两种......
  • C和C++动态库区别
    1.C语言导出动态库需要在返回值和函数之间加上__declspec(dllexport)2.C语言导出动态库需要在class和类名之间加上__declspec(dllexport)3.C++由于支持函数重载,所以在编译时要给每个函数名重新改名字(加上参数信息),而C不支持,所以C语言无法使用C++的动态库4.在C++里导出dll时,使......
  • C/C++地铁线路查询系统[2023-09-05]
    C/C++地铁线路查询系统[2023-09-05]地铁线路查询问题描述:当一个用户从甲地到乙地时,由于不同需求,就有不同的交通路线,有人希望以最短距离到达,有人希望用最少的换乘次数等。请编写一北京地铁线路查询系统,通过输入起始站、终点站,为用户提供两种或以上决策的交通咨询。设计要求:......
  • C/C++《程序设计(上机)》选题[2023-09-05]
    C/C++《程序设计(上机)》选题[2023-09-05]2023-2024-1《程序设计(上机)》授课计划开发工具:TurboC/Visualstudio等等具体要求:用上述系统平台和开发工具完成所分配题目的程序,并撰写报告。一、课程任务概述本课程是学生在学习了C或C++等编程语言之后进行的一次实践性学习,通过......
  • 【C++】 bind examples
    SimpleExample#include<algorithm>#include<vector>#include<iostream>voidprint(std::stringprefix,intnumber){std::cout<<prefix<<"-"<<number<<std::endl;}intmain(intargc,char......
  • C++系列十:日常学习-类型转换
    目录介绍:案例:介绍:C++提供了几种类型转换(typeconversion)的方式,包括静态转换(static_cast)、动态转换(dynamic_cast)、常量转换(const_cast)和重新解释转换(reinterpret_cast)。static_cast:这是最通用的转换,可以用于非多态类型之间的转换,也可以用于多态类型到非多态类型的转换。没有运......
  • C++系列十:日常学习-非多态类型和多态类型
    目录介绍:案例:介绍:非多态类型和多态类型是C++中的两种类型,它们的主要区别在于是否包含虚函数和是否能进行动态绑定。非多态类型是指没有虚函数的类型。这种类型在编译时进行类型检查,因此不能在运行时改变其静态类型。对于非多态类型,编译器在编译时就已经确定了其所有信息,包括成......
  • 《C++》11新特性--多线程
    thread创建线程,不会阻塞主线程thread成员函数voidthread::join();阻塞线程,当前线程执行完毕才会往下执行boolthread::joinble();线程是否可以连接,返回voidthread::detach();分离主线程和子线程的关联voidprintI(){for(size_ti=0;i<100;i++){std::c......
  • C++将派生类赋值给基类
    在C/C++中经常会发生数据类型的转换,例如将int类型的数据赋值给float类型的变量时,编译器会先把int类型的数据转换为float类型再赋值;反过来,float类型的数据在经过类型转换后也可以赋值给int类型的变量。数据类型转换的前提是,编译器知道如何对数据进行取舍。例如:inta=......