C++ | 数据库连接池
文章目录
- 前言
- 一、连接池的存在意义
- 二、连接池实现原理
- 1.连接池建立:
- 2.连接池管理:
- 3.连接池关闭:
- 三、连接池功能实现
前言
记录一下C++实现数据库连接池项目思路。
一、连接池的存在意义
数据库连接池负责分配、管理、和释放数据库连接,允许使用应用程序重复使用一个现有的数据库连接。
数据库连接是关键有限且昂贵的资源,一个数据库连接对象均对应一个物理数据库的连接,每次操作都打开一个物理连接,使用完都关闭连接。
访问MySQL时,执行一个SQL命令,需要经过:(1)TCP三次握手;(2)MySQL Server连接认证;(3)SQL执行;(4)MySQL Server关闭连接回收资源;(5)TCP四次挥手。
通过增加连接池可以提高MySQL Server访问效率(也可采用服务器端增加缓存服务器缓存常用数据方式)。高并发情况下,大量TCP三次握手、MySQL Server连接认证、MySQL Server关闭连接回收资源、TCP四次挥手耗费的性能时间明显。使用数据库连接池在第一次访问的时候,需要建立连接。 但是之后的访问,均会复用之前创建的连接,直接执行SQL语句。
二、连接池实现原理
数据库连接池的解决方案是在应用程序启动时建立足够的数据库连接,并将这些连接组成一个连接池(简单说:在一个“池”里放了好多半成品的数据库联接对象),由应用程序动态地对池中的连接进行申请、使用和释放。对于多于连接池中连接数的并发请求,应该在请求队列中排队等待。并且应用程序可以根据池中连接的使用率,动态增加或减少池中的连接数。
连接池工作原理主要由三个部分组成:连接池的建立、连接池中连接的使用管理、连接池的关闭。
1.连接池建立:
系统初始化时,连接池会根据系统配置建立,并在池中创建了几个连接对象(初始连接量 initSize),以便使用时能从连接池中获取.应用发起MySQL访问时,不在创建和MySQL Server新的连接,直接从连接池中获取一个可用连接,使用完后会归还到连接池。连接池中的连接不能随意创建和关闭,这样避免了连接随意建立和关闭造成的系统开销。
2.连接池管理:
连接池管理策略是连接池机制的核心,连接池内连接的分配和释放对系统的性能有很大的影响。其管理策略是:
当客户请求数据库连接时,首先查看连接池中是否有空闲连接,如果存在空闲连接,则将连接分配给客户使用;如果没有空闲连接,则查看当前所开的连接数是否已经达到最大连接量 maxSize,如果没达到就重新创建一个连接给请求的客户;如果达到就按设定的连接超时时间 connectionTimeout进行等待,如果超出等待时间,则连接失败,抛出异常给客户。
并发请求增多后,连接池中连接数量会动态增加,有些连接使用完后会再次归还到连接池。若在指定的最大空闲时间 maxldleTime内,新增的连接都没有被再次使用,那么新增的连接资源就要被回收,只保持初始连接量的个数。
当客户释放数据库连接时,先判断该连接的引用次数是否超过了规定值,如果超过就从连接池中删除该连接,否则保留为其他客户服务。
该策略保证了数据库连接的有效复用,避免频繁的建立、释放连接所带来的系统资源开销。
3.连接池关闭:
当应用程序退出时,关闭连接池中所有的连接,释放连接池相关的资源。
三、连接池功能实现
- 连接池只需要一个实例,所以按照单例模式进行设计
- 从连接池中可以获取和MySQL的连接、
- 空闲连接全部维护在一个线程安全的队列里,使用线程互斥锁保证队列的线程安全
- 如果连接队列为空,还需要再获取连接,需要动态创建连接,上限数量maxSize
- 队列中空闲连接时间超过maxldleTime就要被释放,只保留初始连接。(独立线程)
- 若队列为空,此时连接数量达到上限,等待超时还获取不到连接,则获取连接失败。此处从队列获取空闲连接,可以使用带超时时间的互斥锁来实现超时连接时间
- 用户获取的连接用智能指针管理,用lambda表达式定制连接释放的功能(不直接释放连接,而是归还到连接池中)
- 连接的生产和消费采用生产者-消费者线性模型来设计,使用线程间同步通信机制条件变量和互斥锁
参考:
https://blog.csdn.net/frightingforambition/article/details/25464129
https://blog.csdn.net/CrankZ/article/details/82874158
C++ | 数据库连接池相关推荐
- c#打开数据库连接池的工作机制_数据库连接池-tomcat-jdbc使用笔记
现在 主流的数据库连接池有:Proxool.C3P0.DBCP.tomcat-jdbc.Druid.其中tomcat-jdbc是tomcat服务器比较可靠的 数据库连接池. Tomcat 在 7.0 ...
- Druid数据库连接池超时问题com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 1000, active 10
问题描述: com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 1000, active 10at com.alibab ...
- Druid数据库连接池使用参考
一:添加相应依赖 druid-1.0.9.jar: mysql-connector-java-5.1.48-bin.jar 二:编写properties文件 放置位置在src中: driverClas ...
- mysql连接池为何不用nio_为什么要用数据库连接池?
1.为什么要用数据库连接池? 最原始的数据库使用就是打开一个连接并进行使用,使用过后一定要关闭连接释放资源.由于频繁的打开和关闭连接对jvm包括数据库 都有一定的资源负荷,尤其应用压力较大时资源占用比 ...
- net core mysql 连接池_EF Core 小坑:DbContextPool 会引起数据库连接池连接耗尽
EF Core 小坑:DbContextPool 会引起数据库连接池连接耗尽 发布时间:2019-02-18 22:05, 浏览次数:1152 , 标签: EF Core DbContextPool ...
- 数据库连接池,实现及分析
在我们日常对数据库操作时存在一个问题,要为每次数据操作请求建立一个数据库连接.而每次建立连接都需要花费很多开销,如加载驱动类.注册驱动.获取连接,这样如果在短时间内连接多次,就 会耗费多余的时间(加载 ...
- swoole实现数据库连接池
2019独角兽企业重金招聘Python工程师标准>>> 原生 PHP CURD 让我们来回顾一下PHP中数据库的使用 <?php # curd.php$id = 1;$dbh ...
- 聊一个不常见的面试题:为什么数据库连接池不采用 IO 多路复用?
欢迎关注方志朋的博客,回复"666"获面试宝典 今天我们聊一个不常见的 Java 面试题:为什么数据库连接池不采用 IO 多路复用? 这是一个非常好的问题.IO多路复用被视为是非常 ...
- 为什么数据库连接池不采用 IO 多路复用?
欢迎关注方志朋的博客,回复"666"获面试宝典 接着,今天我们聊一个不常见的 Java 面试题:为什么数据库连接池不采用 IO 多路复用? 这是一个非常好的问题.IO多路复用被视为 ...
- 数据库连接池为什么要用threadlocal呢?不用会怎样?
点击关注公众号,Java干货及时送达 来源:blog.csdn.net/qq_42405666/article/details/108258820 这个问题我疑问了很久很久,主要如下截图. 个连接对应 ...
最新文章
- server sql 数据c盘迁移d盘_oracle 11g dbf数据文件从C盘迁移到D盘
- 监督学习和无监督学习
- 手机视频直播解决方案
- JDK Long源码
- 联想拯救者y空间兑换代码_十代酷睿全面升级 拯救者Y7000P 2020产品解读
- java os库_java-Mac OS X上的JNotify?
- 维拉智能管家机器人_“女性机器人”广受欢迎,但却面临3大问题,男性坦言:不敢用...
- C++之指针探究(一):一级指针和二级指针
- Python:Numpy库中的invert()函数的用法
- 元素命名空间中的“MvcBuildViews”无效
- 一周第二次课(12月12日)
- Vue.js 还是 React?你会选择哪一个?为什么?
- SAS入门教程1---SAS系统简介
- 10个炫酷特效的网页写法(附源码),拿去就能用,nice
- C++语言99个常见编程错误 常见错误24:晦涩难懂的operator-
- 【领域泛化论文阅读】Birds of A Feather Flock Together:Category-Divergence Guidance for DomainAdaptiveSegmentat
- 新版悟能口罩预约小程序源码V1.1.1
- 什么是实人认证?需要用到哪些api接口
- 2021.04.13丨sRNAnalyzer报错fastx_collapser: Invalid input: This looks like a multi-line FASTA file解决办法
- 苹果x重启方法_iPhone无法开机怎么办?三种快速维修方法