Skip to content

这是一个由C++实现的Mysql Server数据库连接池项目,经压力测试,在高并发情况下能明显提升数据库访问效率

Notifications You must be signed in to change notification settings

Ge-ze/MysqlConnectionPool

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

缘起

在高并发情况下,大量的TCP三次握手、MySQL Server连接认证、MySQL Server关闭连接回收资源和TCP四次挥手会极大的增大耗时,通过使用连接池可以显著提高MySQL Server的访问效率,故自己实现一个。

基本功能

  • 初始连接量(initSize) 连接池事先会和MySQL Server创建initSize个数的connection连接,当应用发起MySQL访问时,直接从连接池中获取一个可用连接,使用完后将当前连接归回到连接池。
  • 最大连接量(maxSize) 当并发访问MySQL Server的请求增多时,初始连接量已经不够用,此时会根据新的请求数量去创建更多的连接给应用使用。但每一个连接都会占用一个socket资源,为了防止影响服务器对客户端的并发请求处理,需要限定连接池连接数量上限。
  • 最大空闲时间(maxIdleTime) 当访问量从高峰降下来时,为减少服务器维护连接的资源开销,需要将超过最大空闲时间的连接回收,只需保持initSize个连接就可以。
  • 连接超时时间(connectionTimeOut) 当MySQl的并发量过大,连接池中连接数量已经达到maxSize且没有空闲连接可供使用时,需要通过阻塞的方式等待获取连接,若超过connectionTimeOut则提示连接失败。

连接池设计

  1. 连接池只需要一个实例对象,故ConnectionPool采用单例模式进行设计

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

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

  4. 当并发量较高时及initSize数量的连接不够使用时,需要动态创建连接,上限数量是maxSize

  5. 当并发量回落时,回收掉队列中空闲连接时间超过maxIdleTime的连接,只保留初始的initSize个连接

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

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

  8. 为方便使用,采用配置文件方式一键式定制线程池

开发及测试环境

  • Centos 7
  • GCC 8.3.1 20190311 (Red Hat 8.3.1-3)
  • Cmake 3.12.4
  • MySQL Server 8.0.34
  • 虚拟机配置:一颗2核CPU

性能测试

未使用连接池:

数据量 单线程 四线程
1000 8913ms 1197ms
5000 42626ms 5706ms
10000 86300ms 11767ms
100000 --- 106588ms

使用连接池:

数据量 单线程 四线程
1000 1161ms 441ms
5000 5831ms 1851ms
10000 11337ms 3613ms
100000 --- 36290ms

About

这是一个由C++实现的Mysql Server数据库连接池项目,经压力测试,在高并发情况下能明显提升数据库访问效率

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published