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.连接池关闭:

当应用程序退出时,关闭连接池中所有的连接,释放连接池相关的资源。

三、连接池功能实现

  1. 连接池只需要一个实例,所以按照单例模式进行设计
  2. 从连接池中可以获取和MySQL的连接、
  3. 空闲连接全部维护在一个线程安全的队列里,使用线程互斥锁保证队列的线程安全
  4. 如果连接队列为空,还需要再获取连接,需要动态创建连接,上限数量maxSize
  5. 队列中空闲连接时间超过maxldleTime就要被释放,只保留初始连接。(独立线程)
  6. 若队列为空,此时连接数量达到上限,等待超时还获取不到连接,则获取连接失败。此处从队列获取空闲连接,可以使用带超时时间的互斥锁来实现超时连接时间
  7. 用户获取的连接用智能指针管理,用lambda表达式定制连接释放的功能(不直接释放连接,而是归还到连接池中)
  8. 连接的生产和消费采用生产者-消费者线性模型来设计,使用线程间同步通信机制条件变量和互斥锁

参考:
https://blog.csdn.net/frightingforambition/article/details/25464129
https://blog.csdn.net/CrankZ/article/details/82874158

你可能感兴趣的:(数据库,c++,mysql)