基于C++的MySQL数据库连接池功能设计

背景

了解MySQL数据库都知道,它是基于C/S设计的,通过TCP进行双向通信,这就会带来访问瓶颈。为了解决这一问题,服务器端可以增加缓存服务器缓存常用的数据(例如redis),而在服务端和客户端之间,还可以增加连接池,来提高MySQL Server的访问效率。

在市场上已经存在很多好用的连接池,包括阿里的druid,c3p0以及apache dbcp连接池,它们对于短时间内大量的数据库增删改查操作性能的提升是很明显的。但是,其全都是Java实现的!而由于项目高并发的特点,需要实现基于C++的MySQL连接池模块,提高访问效率,故在此记录设计过程。

连接池功能点介绍

目的:

在高并发访问数据库的情况下,大量的 TCP三次握手、MySQL Server连接认证、MySQL Server关闭连接回收资源和TCP四次挥手所耗费的性能时间也是很明显的,增加连接池就是为了减少这一部分的性能损耗。

主要参数:

连接池一般包含了数据库连接所用的ip地址、port端口号、用户名和密码以及其它的性能参数,例如初始连接量,最大连接量,最大空闲时间、连接超时时间等,结合本项目需求特点,实现以上几个所有连接池都支持的通用基础功能即可。

初始连接量(initSize):表示连接池事先会和MySQL Server创建initSize个数的connection连接。

最大连接量(maxSize):当并发访问MySQL Server的请求量超过初始连接量,会根据新的请求数量去创建更多的连接给应用去使用,但是新创建的连接数量上限是maxSize。

最大空闲时间(maxIdleTime):对于超过初始连接量的新建连接,如果在指定的maxIdleTime里面没有被再次使用过,那么要清理并保持初始连接量initSize个连接。

连接超时时间(connectionTimeout):当连接池中的连接数量已经到达 maxSize了,而此时没有空闲的连接可供使用,那么此时应用从连接池获取连接无法成功,它通过阻塞的方式获取连接的时间如果超过connectionTimeout时间,那么获取连接失败,无法访问数据库。

功能实现设计

两个主要的类:连接池ConnectionPool类 和 连接Connection 类

连接池主要包含了以下功能点:

1.连接池类只需要一个实例,所以以单例模式进行设计

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

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

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

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

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

7.每一个连接对象的生命周期管理,需要用完归还回队列

源代码

https://download.csdn.net/download/qq_20756957/89041458

  • 29
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值