跳到主要内容

数据库连接池

一、mysql连接池


### 1.1什么是mysql连接池

[数据库](http://lib.csdn.net/base/mysql "MySQL知识库")连接池(Connection pooling)是程序启动时建立足够的数据库连接,并将这些连接组成一个连接池,由程序动态地对池中的连接进行申请,使用,释放。

### 1.2 为什么需要mysql连接池

创建数据库连接是一个很耗时的操作,MySQL短连接每次请求操作数据库都需要建立与MySQL服务器建立TCP连接,这是需要时间开销的,TCP连接需要3次网络通信。这样就增加了一定的延时和额外的IO消耗,在并发量非常大的情况就会有影响

假设有100台PHP的应用服务器,每个机器需要启动100个apache或fpm工作进程,那每个进程都会产生一个长连接到MySQL。这一共会产生1万个My SQL连接。大家都知道MySQL是每个连接会占用1个线程。那MYSQL就需要创建1万个线程,这样大量的系统资源被浪费在线程间上下文切换上。而你的业务代码中并不是所有地方都在做数据库操作,所以这个就是浪费的。

### 1.3如何解决

如果有连接池就不同了,如并发100个请求,实际上并不是每个请求的所有时间都在执行SQL查询。这样100个请求,共享20个MySQL连接就可以满足需求了。当一个请求操作完数据库后,开始进入模板渲染等流程,这时就会释放数据库连接给其他的请求使用。

### 1.4 适合场景

连接池仅在出现高并发的应用中才有价值,连接池并没有提高sql的查询速度,连接池是用来保护数据库的,不是用来提升性能的

当并发请求QPS达到数万或者数十万时,MySQL服务器就需要维持十万级的连接。这时数据库的压力就会非常大了。连接池技术就可以派上用场了,可以大大降低数据库连接数,减入服务器压力。

二、mysql连接池创建
-------------

数据的连接池为维持若干个长连接,当新请求到达的时候,如果连接池有空闲连接,就分配给连接池去处理,否则,后面的数据库连接请求将被加入到等待队列中。

### 2.1数据库连接池的机制:

(1) 程序初始化时创建连接池
(2) 使用时向连接池申请可用连接
(3) 使用完毕,将连接返还给连接池
(4) 程序退出时,断开连接,并释放资源

![](70A674960DF5A024A700189F6E2AF136.png)

### 2.2 数据库连接池设计

1、创建连接:连接池启动后,初始化一定的空闲连接,指定为最少的连接min。当连接池为空,不够用时,创建新的连接放到池里,但不能超过指定的最大连接max数量。

2、连接释放:每次使用完连接,一定要调用释放方法,把连接放回池中,给其他程序或请求使用。

3、连接分配:连接池中用pop和push的方式对等入队和出队分配与回收。能实现阻塞分配,也就是在池空并且已创建数量大于max,阻塞一定时间等待其他请求的连接释放,超时则返回null。

4、连接管理:对连接池中的连接,定时检活和释放空闲连接等