连接池的原理

1. 连接池的含义

数据库连接池(Connection pooling)是程序启动时建立足够的数据库连接,并将这些连接组成一个连接池,由程序动态地对池中的连接进行申请,使用,释放。

2. 连接池的作用

为什么使用数据库连接池呢?

  1. 资源复用
    由于数据库连接得到复用,避免了频繁的创建、释放连接引起的性能开销,在减少系统消耗的基础上,另一方面也增进了系统运行环境的平稳性(减少内存碎片以及数据库临时进程/线程的数量)。
  2. 更快的系统响应速度
    数据库连接池在初始化过程中,往往已经创建了若干数据库连接置于池中备用。此时连接的初始化工作均已完成。对于业务请求处理而言,直接利用现有可用连接,避免了从数据库连接初始化和释放过程的开销,从而缩减了系统整体响应时间。
  3. 统一的连接管理,避免数据库连接泄露
    在较为完备的数据库连接池实现中,可根据预先的连接占用超时设定,强制收回被占用连接。从而避免了常规数据库连接操作中可能出现的资源泄露。

2.1 不使用连接池的情况

此时多线程下完整的处理过程:
1. TCP建立连接的三次握手(客户端与MySQL服务器的连接基于TCP协议)
2. MySQL认证的三次握手
3. 真正的SQL执行
4. MySQL的关闭
5. TCP的四次握手关闭

可以看到,为了执行一条SQL,需要进行TCP三次握手,Mysql认证、Mysql关闭、TCP四次挥手等其他操作,执行SQL操作在所有的操作占比非常低。

在这里插入图片描述

不使用连接池的任务流程

优点:实现简单 省了连接池的设计。
缺点:
1. 每一次发起SQL操作都经历TCP建立连接、数据库用户身份验证、数据库用户登出、TCP断开连接。
2. 网络IO较多
3. 带宽利用率低
4. QPS较低
5. 应用频繁低创建连接和关闭连接,导致临时对象较多,带来更多的内存碎片
6. 在关闭连接后,会出现大量TIME_WAIT 的TCP状态(在2个MSL之后关闭)

2.2 使用连接池的情况

第一次访问的时候,需要建立连接, 但是之后的访问,均会复用之前创建的连接,直接执行SQL语句。

在这里插入图片描述

使用连接池的任务流程

优点:
1. 降低了网络开销
2. 连接复用,有效减少连接数。
3. 提升性能,避免频繁的新建连接。新建连接的开销比较大
4. 没有TIME_WAIT状态的问题
缺点:
6. 设计较为复杂

3. 连接池和线程池的关系

在这里插入图片描述

连接池管理数据库示意图

连接池和线程池的区别是:
线程池:主动调用任务。当任务队列不为空的时候从队列取任务取执行。
连接池:被动被任务使用。当某任务需要操作数据库时,只要从连接池中取出一个连接对象,当任务使用完该连接对象后,将该连接对象放回到连接池中。如果连接池中没有连接对象可以用,那么该任务就必须等待。

一般线程池线程数量和连接池连接对象数量一致,线程执行任务完毕的时候归还连接对象

4. 连接池设计要点

  1. 连接到数据库
    需要配置:数据库ip、端口、用户名、密码、数据库名字等;
    最小连接数(一般线程池的线程数量)和最大连接数(核数*2 + 磁盘数量)
    连接池的名字(一个连接池管理一个数据库)
  2. 需要一个队列管理他的连接,比如使用list;
  3. 获取连接对象:
  4. 归还连接对象;

5. 使用实测

平台为 腾讯云ubuntu 20.04 2核2G(2个CPU,每个为2核)
测试内容为简单的mysql操作:向表中插入1000条用户信息。是否使用连接池的差别是每次插入操作是否重新初始化连接。
结果如下:

线程数量使用连接池不用连接池
16856 ms14655 ms
22781 ms8925 ms
41994 ms7011 ms
81255 ms6274 ms
16728 ms6468 ms
32659 ms6601 ms
64946 ms6892 ms
1281452 ms7408 ms

以上结果可看出虽然经验公式线程数量为:
连接数 = ((核心数 * 2) + 有效磁盘数),但是具体问题还需要具体分析。因此实际需要根据实际的O等待时间和CPU处理时间的比例调整线程数。

具体调整方法为:

如果任务整体上是一个IO密集型的任务,在处理一个请求的过程中(处理一个任务),总共耗时100+5=105ms,而其中只有5ms是用于计算操作的(消耗cpu),另外的100ms等待io响应,CPU利用率为5/(100+5)。
使用线程池是为了尽量提高CPU的利用率,减少对CPU资源的浪费,假设以100%的CPU利用率来说,要达到100%的CPU利用率,对于一个CPU就要设置其利用率的倒数个数的线程数,也即1/(5/(100+5))=21,4个CPU线程池要设置84个线程数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值