MySQL数据库连接池项目实现

目录

关键技术点

项目背景

连接池功能点介绍

连接池功能点实现

压力测试


关键技术点

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


项目背景

提高MySQL数据库(基于C/S)的访问瓶颈,除了在服务器端增加缓存服务器缓存常用的数据之外(redis),还可以增加连接池。在高并发情况下,大量的TCP三次握手,四次挥手,MySQL  Server连接认证,MySQL Server关闭连接回收资源等过程会浪费一些时间,连接池的实现就是为了减少这部分时间的损耗。 


 
连接池一般包含了数据库连接所用的 ip 地址、 port 端口号(MySQL默认为3306)、用户名和密码以及其它的性能参数,例如初始连接量,最大连接量,最大空闲时间、连接超时时间等,该项目是基于C++ 语言实现的连接池,主要实现以下几个所有连接池都支持的通用基础功能。
 
初始连接量( initSize :表示连接池事先会和 MySQL Server 创建 initSize 个数的 connection 连接,当应用发起MySQL 访问时,不用再创建和 MySQL Server 新的连接,直接从连接池中获取一个可用的连接就可以,使用完成后,并不去释放connection ,而是把当前 connection 再归还到连接池当中。
 
最大连接量( maxSize :当并发访问 MySQL Server 的请求增多时,初始连接量已经不够使用了,此时会根据新的请求数量去创建更多的连接给应用去使用,但是新创建的连接数量上限是maxSize ,不能无限制的创建连接,因为每一个连接都会占用一个socket 资源,一般连接池和服务器程序是部署在一台主机上的,如果连接池占用过多的socket 资源,那么服务器就不能接收太多的客户端请求了。当这些连
接使用完成后,再次归还到连接池当中来维护。
 
最大空闲时间( maxIdleTime :当访问 MySQL 的并发请求多了以后,连接池里面的连接数量会动态 增加,上限是maxSize 个,当这些连接用完再次归还到连接池当中。如果在指定的 maxIdleTime 里面,这些新增加的连接都没有被再次使用过,那么新增加的这些连接资源就要被回收掉,只需要保持初始连 接量initSize 个连接就可以了。
 
连接超时时间( connectionTimeout :当 MySQL 的并发请求量过大,连接池中的连接数量已经到达maxSize了,而此时没有空闲的连接可供使用,那么此时应用从连接池获取连接无法成功,它通过阻塞的方式获取连接的时间如果超过connectionTimeout 时间,那么获取连接失败,无法访问数据库。
 
该项目主要实现上述的连接池四大功能,其余连接池更多的扩展功能,可以自行实现。
 
ConnectionPool.cpp ConnectionPool.h: 连接池代码实现
Connection.cpp Connection.h :数据库操作代码、增删改查代码实现
 
连接池主要包含了以下功能点
1. 连接池只需要一个实例,所以 ConnectionPool 以单例模式进行设计
2. ConnectionPool 中可以获取和 MySQL 的连接 Connection
3. 空闲连接 Connection 全部维护在一个线程安全的 Connection 队列中,使用线程互斥锁保证队列的线程安全
4. 如果 Connection 队列为空,还需要再获取连接,此时需要动态创建连接,上限数量是 maxSize
5. 队列中空闲连接时间超过 maxIdleTime 的就要被释放掉,只保留初始的 initSize 个连接就可以了,这个功能点需要放在独立的线程中去做
6. 如果 Connection 队列为空,而此时连接的数量已达上限 maxSize ,那么等待 connectionTimeout 时间如果还获取不到空闲的连接,那么获取连接失败,此处从Connection 队列获取空闲连接,可以使用带超时时间的mutex 互斥锁来实现连接超时时间
7. 用户获取的连接用 shared_ptr 智能指针来管理,用 lambda 表达式定制连接释放的功能(不真正释放连接,而是把连接归还到连接池中)
8. 连接的生产和连接的消费采用生产者 - 消费者线程模型来设计,使用了线程间的同步通信机制条件变量和互斥锁
9.需要一个新的定时线程,方便连接生产线程进行回收超过initSize数量的空闲线程
 

 压力测试

数据量 未使用连接池花费时间 使用连接池花费时间
1000 单线程:1891m's  四线程:497m's 单线程:1079m's  四线程:408m's
5000 单线程:10033m's  四线程:2361m's 单线程:5380m's  四线程:2041m's
10000 单线程:19403m's  四线程:4589m's 单线程:10522m's  四线程:4034m's

 可以看出使用连接池后性能上得到了一定改善。标题为MySQL数据库连接池实现,实际上该项目为一个公共连接池具体实现,只是以MySQL数据库为例而已。

具体代码:https://github.com/fdklcl/ConnectionPool

注:数据库表需自己建立

 

发布了40 篇原创文章 · 获赞 124 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/FDk_LCL/article/details/105372542