# 百度百科

## [数据库连接池](https://www.cnblogs.com/newpanderking/p/3875749.html)

百度：[https://baike.baidu.com/item/数据库连接池/1518538](https://baike.baidu.com/item/%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BF%9E%E6%8E%A5%E6%B1%A0/1518538)

## 百度百科

数据库连接池负责分配、管理和释放数据库连接，它允许应用程序重复使用一个现有的数据库连接，而不是再重新建立一个；释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。

## 背景

数据库连接是一种关键的、有限的、昂贵的资源，这一点在多用户的网页应用程序中体现得尤为突出。对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性，影响到程序的性能指标。数据库连接池正是针对这个问题提出来的。

## 影响因素

数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中，这些数据库连接的数量是由最小数据库连接数制约。无论这些数据库连接是否被使用，连接池都将一直保证至少拥有这么多的连接数量。连接池的最大数据库连接数量限定了这个连接池能占有的[最大连接数](https://baike.baidu.com/item/%E6%9C%80%E5%A4%A7%E8%BF%9E%E6%8E%A5%E6%95%B0)，当应用程序向连接池请求的连接数超过最大连接数量时，这些请求将被加入到等待队列中。数据库连接池的最小连接数和最大连接数的设置要考虑到下列几个因素：

**1. 最小连接数**

是连接池一直保持的数据库连接，所以如果应用程序对数据库连接的使用量不大，将会有大量的数据库连接资源被浪费。

**2. 最大连接数**

是连接池能申请的最大连接数，如果数据库连接请求超过此数，后面的数据库连接请求将被加入到等待队列中，这会影响之后的数据库操作。

**3. 最小连接数与最大连接数差距**

最小连接数与最大连接数相差太大，那么最先的连接请求将会获利，之后超过最小连接数量的连接请求等价于建立一个新的数据库连接。不过，这些大于最小连接数的数据库连接在使用完不会马上被释放，它将被放到连接池中等待重复使用或是空闲超时后被释放。

## 原理

连接池基本的思想是在[系统初始化](https://baike.baidu.com/item/%E7%B3%BB%E7%BB%9F%E5%88%9D%E5%A7%8B%E5%8C%96)的时候，将数据库连接作为对象存储在内存中，当用户需要访问数据库时，并非建立一个新的连接，而是从连接池中取出一个已建立的空闲连接对象。使用完毕后，用户也并非将连接关闭，而是将连接放回连接池中，以供下一个请求访问使用。而连接的建立、断开都由连接池自身来管理。同时，还可以通过设置连接池的参数来控制连接池中的初始连接数、连接的上下限数以及每个连接的最大使用次数、最大空闲时间等等。也可以通过其自身的管理机制来监视数据库连接的数量、使用情况等。

## Java连接池

在Java中开源的数据库连接池有以下几种 ：

1、C3P0：是一个开放源代码的JDBC连接池，它在lib目录中与Hibernate一起发布，包括了实现jdbc3和jdbc2扩展规范说明的Connection 和Statement 池的DataSources 对象。

2、Proxool：是一个Java SQL Driver驱动程序，提供了对选择的其它类型的驱动程序的连接池封装。可以非常简单的移植到现存的代码中，完全可配置，快速、成熟、健壮。可以透明地为现存的JDBC驱动程序增加连接池功能。

3、Jakarta DBCP：DBCP是一个依赖Jakartacommons-pool[对象池](https://baike.baidu.com/item/%E5%AF%B9%E8%B1%A1%E6%B1%A0)机制的数据库连接池。DBCP可以直接的在应用程序中使用。

4、DDConnectionBroker：是一个简单、轻量级的数据库连接池。

5、DBPool：是一个高效、易配置的数据库连接池。它除了支持连接池应有的功能之外，还包括了一个对象池，使用户能够开发一个满足自己需求的数据库连接池。

6、XAPool：是一个XA数据库连接池。它实现了javax.sql.XADataSource并提供了连接池工具。

7、Primrose：是一个Java开发的数据库连接池。当前支持的容器包括Tomcat4&5、Resin3与JBoss3。它同样也有一个独立的版本，可以在应用程序中使用而不必运行在容器中。Primrose通过一个WEB接口来控制SQL处理的追踪、配置，以及动态池管理。在重负荷的情况下可进行连接[请求队列](https://baike.baidu.com/item/%E8%AF%B7%E6%B1%82%E9%98%9F%E5%88%97)处理。

8、SmartPool：是一个连接池组件，它模仿[应用服务器](https://baike.baidu.com/item/%E5%BA%94%E7%94%A8%E6%9C%8D%E5%8A%A1%E5%99%A8)[对象池](https://baike.baidu.com/item/%E5%AF%B9%E8%B1%A1%E6%B1%A0)的特性。SmartPool能够解决一些临界问题如连接泄漏（connection leaks）、连接阻塞、打开的JDBC对象（如Statements、PreparedStatements）等。SmartPool的特性包括：

* 支持多个pool
* 自动关闭相关联的JDBC对象
* 在所设定time-outs之后察觉连接泄漏
* 追踪连接使用情况
* 强制启用最近最少用到的连接
* 把SmartPool“包装”成现存的一个pool

9、MiniConnectionPoolManager：是一个轻量级[JDBC](https://baike.baidu.com/item/JDBC)数据库连接池。它只需要Java1.5（或更高）并且没有依赖第三方包。

10、BoneCP：是一个快速、开源的数据库连接池。帮用户管理[数据连接](https://baike.baidu.com/item/%E6%95%B0%E6%8D%AE%E8%BF%9E%E6%8E%A5)，让应用程序能更快速地访问数据库。比C3P0/DBCP连接池速度快25倍。

11、Druid：Druid不仅是一个数据库连接池，还包含一个ProxyDriver、一系列内置的JDBC组件库、一个SQL Parser。

支持所有JDBC兼容的数据库，包括Oracle、MySql、Derby、Postgresql、SQL Server、H2等。[Druid](https://baike.baidu.com/item/Druid)针对Oracle和MySql做了特别优化，比如：

* Oracle的PS Cache内存占用优化
* MySql的ping检测优化

Druid提供了MySql、Oracle、Postgresql、SQL-92的SQL的完整支持，这是一个手写的高性能SQL Parser，支持Visitor模式，使得分析SQL的抽象语法树很方便。

简单SQL语句用时10微秒以内，复杂SQL用时30微秒。

通过Druid提供的SQL Parser可以在JDBC层拦截SQL做相应处理，比如说分库分表、审计等。Druid防御SQL注入攻击的WallFilter，就是通过Druid的SQL Parser分析语义实现的
