在高并发情况下,大量的TCP三次握手、MySQL Server连接认证、MySQL Server关闭连接回收资源和TCP四次挥手会极大的增大耗时,通过使用连接池可以显著提高MySQL Server的访问效率,故自己实现一个。
- 初始连接量(initSize) 连接池事先会和MySQL Server创建initSize个数的connection连接,当应用发起MySQL访问时,直接从连接池中获取一个可用连接,使用完后将当前连接归回到连接池。
- 最大连接量(maxSize) 当并发访问MySQL Server的请求增多时,初始连接量已经不够用,此时会根据新的请求数量去创建更多的连接给应用使用。但每一个连接都会占用一个socket资源,为了防止影响服务器对客户端的并发请求处理,需要限定连接池连接数量上限。
- 最大空闲时间(maxIdleTime) 当访问量从高峰降下来时,为减少服务器维护连接的资源开销,需要将超过最大空闲时间的连接回收,只需保持initSize个连接就可以。
- 连接超时时间(connectionTimeOut) 当MySQl的并发量过大,连接池中连接数量已经达到maxSize且没有空闲连接可供使用时,需要通过阻塞的方式等待获取连接,若超过connectionTimeOut则提示连接失败。
-
连接池只需要一个实例对象,故ConnectionPool采用单例模式进行设计
-
从ConnectionPool中可以获取和MySQL Server的连接connection
-
空闲连接Connection全部维护在一个线程安全的_connectionQue队列中,使用线程互斥锁保证队列的线程安全
-
当并发量较高时及initSize数量的连接不够使用时,需要动态创建连接,上限数量是maxSize
-
当并发量回落时,回收掉队列中空闲连接时间超过maxIdleTime的连接,只保留初始的initSize个连接
-
用户获取的连接用shared_ptr智能指针来管理,用lambda表达式定制连接释放的功能(不真正释放连接,而是把连接归还到连接池中)
-
连接的生产和连接的消费采用生产者-消费者线程模型来设计,使用了线程间的同步通信机制条件变量和互斥锁
-
为方便使用,采用配置文件方式一键式定制线程池。
- 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 |