Why 连接池
一般我们进行一个数据库操作时,都要进行下面的步骤
- 客户端与服务器端建立连接
- 执行数据库操作
- 释放连接
频繁的数据库的连接和释放会占用大量的时间和资源,于是就有必要重复利用数据库连接,这便要用到连接池技术。
DBCP的使用和配置
DBCP的使用
一个简单的使用示例,但是代码还是有点长,这里放个传送门,有兴趣的可以点进去看看。 DBCPDemo
DBCP的配置
配置信息看这里把,传送门DBCP Configuration
DBCP源码分析
DBCP其实就是一个存储数了据库连接的Object Pool,Object Pool是利用了commons-pool实现的。下面从BasicDataSource开始逐步分析DBCP的代码。
从上图可以看出,BasicDataSource可以看成是一个Adapter模式的实现,其封装了真正实现连接池pool的PoolingDataSource,而PoolingDataSource实现了获
取数据库连接的getConnection方法。
1 2 3 4 5 |
|
_pool就是ObjectPool,其实现是GenericObjectPool,这就是连接池的核心,真正实现Object Pool的地方。PoolGuardConnectionWrapper对Connection做了简单封装,如果通过该连接对数据库进行操作时,连接已经关闭,就会抛出异常。
下面我们重点分析GenericObjectPool的代码,GenericObjectPool的类结构图如下图所示。
GenericObjectPool有三个内部类,分别是Config,Evictor和Latch.Config类包含了各种默认配置信息,如maxActive,maxWait(单位毫秒)等。Evictor类是清道夫,对于pool里过期的Idle对象会进行清理。Latch封装了真实的对象,这里为什么要对真实的对象进行封装,主要是拿它用来排队的,以保证请求的公平性,先来先拿。PoolableObjectFactory是生成对象的工厂接口,在使用pool前需要将其实现(这里是PoolableConnectionFactory)赋给pool的_factory。
GenericObjectPool主要的接口有两个,分别是borrowObject和returnObject。先看下borrowObject的逻辑,代码太长。这里只贴一些主要的代码,有兴趣的可以自己去看。
再看下returnObject,逻辑简单了好多。
话说DBCP和common-pool的代码好老,最近看了下bonecp,据说比DBCP快了30被,以后分析下他的代码。