手写数据库连接池

项目背景

为了提高MySQL数据库(基于C/S设计)的访问瓶颈,除了在服务器端增加缓存服务器缓存常用的数据之外(例如redis),还可以增加连接池,来提高MySQL Server的访问效率,在高并发情况下,大量的TCP三次握手、MySQL Server连接认证、MySQL Server关闭连接回收资源和TCP四次挥手所耗费的性能时间也是很明显的,增加连接池就是为了减少这一部分的性能损耗。

连接池功能:

  1. 初始连接量initSize:表示数据库连接池会事先和Mysql Server创建initSize个数的connection连接,当应用发起Mysql访问时,不会再创建和Mysql Server新的连接,直接从连接池中获取一个可用的连接就可以,使用完成后,并不会去释放connection, 而是把当前connection再归还到连接池中。

  2. 最大连接量maxSize:初始连接量不够,会根据新的请求数量创建连接,设置一个最大连接量,不能无线创建,每一个连接都会占用一个socket资源。如果连接池占用过多的socket资源,那么服务器就不能接收太多的客户端请求了。当这些连接使用完成后,再次归还到连接池当中来维护

  3. 最大空闲时间maxIdleTime: 当访问Mysql的并发请求多了以后,连接池里面的连接数量会动态增加,上线是maxSize,当这些连接用完后归还到连接池中,如果在指定的maxIdleTime时间里面,新增的连接没有被使用,就会被回收掉,只需要保持最初的initSize个连接。

  4. 连接超时时间connectionTimeout:当Mysql并发请求过大,连接池中的连接数量到达maxSize,没有空闲连接可以使用,如果阻塞时间超过connectionTimeout,那么获取连接失败,无法访问数据库。

压力测试

数据量

未使用连接池花费时间

使用连接池花费时间

1000

单线程:958ms, 四线程:327ms

单线程:505ms, 四线程:238ms

5000

单线程:4028ms, 四线程:1389ms

单线程:2397ms, 四线程:1093ms

10000

单线程:8056ms, 四线程:2758ms

单线程:4639ms, 四线程:2041ms

linux下编译

g++ -std=c++11 Connection.cpp CommonConnectionPool.cpp main.cpp -o main -I /usr/include/mysql -L/usr/lib/x86_64-linux-gnu -lmysqlclient -pthread
参数说明:
  • -I/usr/include/mysql:指定 MySQL 头文件的路径。

  • -L/usr/lib/x86_64-linux-gnu:指定 MySQL 库文件的路径。

  • -lmysqlclient:链接 MySQL 客户端库。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值