Apache Commons DBCP原理分析

DBCP数据库连接池的commons-dbcp2依赖commons-pools2提供的池的机制和工具类。
DBCP主要的包分为4部分:
org.apache.commons.dbcp2 : 主要是数据库连接池的API。
org.apache.commons.dbcp2.cpdsadapter:包含一个公共类DriverAdapterCPDS实现了ConnectionPoolDataSource,是它能够适配老的基于JDBC的实现的驱动。
org.apache.commons.dbcp2.datasources:这个包包含2类数据源PerUserPoolDataSourceSharedPoolDataSource 提供的数据库连接。
org.apache.commons.dbcp2.managed: 这个包提供了管理连接的池的支持。
使用数据库连接池的流程:
1.从数据库连接池中获取连接(如果已建立空闲连接直接获取,否则新建连接)
2.执行数据库操作
3.将连接归还的连接池中
这样避免频繁的创建和销毁连接的时间,其实是一种空间换时间的操作。

原理说起来简单,不过还是有许许多多的艺术在里面的,比如,过期销毁,被破坏时销毁,超过连接池大小时销毁,没有空闲的连接时等待等系列问题。我们就来看看DBCP的developer们是如何实现DBCP连接池的。
DBCP中有许多标志性的类,其实每个框架都一样,几个核心的承重类去支撑起了整个框架。
dbcp-1.jpg
BasicDataSource: BasicDataSource通过BasicDataSourceFactory创建,在BasicDataSource包含了很多设置数据库连接池的属性信息,另外还有一个PoolingDataSource的类,在连接池中BasicDataSource使用的就是PoolingDataSource。
dbcp-2.jpg
ConnectionFactory:对于创建Connection的抽象工厂接口,为DataSourceConnection, DriverManagerConnection, DriverConnection的工厂提供抽象。
PoolingDataSource.gif
PoolingDataSource:一个简单的数据源的实现,可以从指定ObjectPool中获取Connection。从图片中可以看出依赖了commons-pool2的类。
PoolingConnection.gif
PoolingConnectionDelegatingConnection 可以共用PreparedStatement,在调用 prepareStatementprepareCall方法的时候,通常是从未使用的 statement池中拉取,而不是每次创建一个新的 PrepareStatement, 这里的PreparedStatement#close 方法实际不是关闭statement,而是将statement返回到池中。
Delegating:从图中可以看出,下半部分都是依赖commons-pool中的类,上层都是DBCP对pool进行了封装,另外还采用了委派的方式。另外可以看出Connect,PrepareStatement以及ResultSet的关系。
AbandonedObjectPool.gif
AbandonedConfig:作为一个属性在对象池中,AbandonedConfig用于配置连接池的废弃策略。
AbandonedTrace: AbandonedTrace用于记录恢复和报告db Connection 的使用情况。
以上是对Apache Commons Pool2的整体核心类进行了说明。

参考:
http://commons.apache.org/proper/commons-dbcp/guide/index.html

添加新评论