DBCP原理分析

数据库连接池多种多样,不得不提到的是代码短小精悍性能又不错的commons-dbcp。

首先看一下官网对于dbcp里面的所有包的介绍:

org.apache.commons.dbcp: database connection pool API

org.apache.commons.dbcp.cpdsadapter: contains the a class ConnectionPoolDataSource (CPDS) implementation can be used to fit the old jdbc implementation based on the drive.

org.apache.commons.dbcp.datasources: contains two data sources: PerUserPoolDataSource, and SharedPoolDataSource, data connection pool.

org.apache.commons.jocl: java object configuration language, an XML application used to describe the java object to be instantiated.

 

操作一个典型的关系型数据库应用的基本步骤

a. 建立连接
b. 执行数据库操作
c. 关闭连接

这样的过程对于一个大访问量的程序来说,频繁的建立连接,断开连接会带来性能瓶颈。所以数据库连接池(Database Connection Pool)应势而生。

 

下面来看一下DBCP原理
用户使用数据库连接池流程:
a. 从连接池中获取一个连接(如果有已建立空闲的连接,直接获取连接,否则建立新连接)
b. 执行数据库操作
c. 将连接归还给数据库连接池

这样就避免了每次连接数据库需要消耗的时间。(PS: 又是一个以空间换时间的案例)

原理说起来简单,不过还是有许许多多的艺术在里面的,比如,过期销毁,被破坏时销毁,超过连接池大小时销毁,没有空闲的连接时等待等系列问题。我们就来看看DBCP的developer们是如何实现DBCP连接池的。

 

 DBCP中有许多标志性的类,其实每个框架都一样,几个核心的承重类去支撑起了整个框架。我们要认识的第一位他是BasicDataSource


                                                            
 BasicDataSource 的实例来自于BasicDataSourceFactory的创建,BasicDataSource里面封装了连接数据库需要的一些内容。开始迷茫BasicDataSource 和PoolingDataSource是什么关系呢,后来跟源码发现,原来用BasicDataSource 其实就是在用PoolingDataSource了。

第二位即将登场ConnectionFactory


                                             

为DataSourceConnection, DriverConnection, DriverManagerConnection三个Factory提供更高的抽象层。

 

PoolingDataSource(这个不用介绍了哈,就是一个DataSource,从图中也可以看出,只不过是这个DataSource不光提供Connection,还封装了ObjectPool而已。

 



 

PoolingConnection,第一反应一定是,不就是个Connection 嘛,它的不同之处就在于该Connection可以提供PoolablePreparedStatement(使得PreparedStatement处于池中,可复用),就断他获取了PreparedStatement,也不是每次都新建一个,而是通过操作池中对象答道复用的效果。这样就完成了整个Pool中的内容可最大化重用的功能。



 

Delegating,个人觉得这张图把整个架构描述得清晰到爆啊,PoolableConnection可以说是在辅助PoolingConnection的功能,因为PoolableConnection中的close方法是将当前的Connection是通过returnObject放回到池中。同时我们清晰的看到Delegating层的作用,以及几种Connection,PreparedStatement,ResultSet之间的关系。



 

AbandonedObjectPool,这是一个存放废弃的连接的连接池其中AbandonedConfig用于配置废弃连接策略,AbandonedTrace用于记录恢复和报告db Connection 的使用情况。



 


 这就是整个DBCP的框架以及原理分析,现在对于DBCP有个整体上的认识了,接下来会陆续跟踪源码,分析DBCP开发者们每个细节的处理。

由于开发经验和能力有限,如果上文中有哪些地方说的不正确,欢迎批评,指出,希望可以通过开源的媒介多交流。

Email zqxjqka@gmail.com

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值