欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

DBCP原理分析

程序员文章站 2022-07-03 14:06:59
...

数据库连接池多种多样,不得不提到的是代码短小精悍性能又不错的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


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

第二位即将登场ConnectionFactory


                                             DBCP原理分析
            
    
    博客分类: commons_dbcp databasedbcpConnectionPool 

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

 

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

 


DBCP原理分析
            
    
    博客分类: commons_dbcp databasedbcpConnectionPool 
 

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


DBCP原理分析
            
    
    博客分类: commons_dbcp databasedbcpConnectionPool 
 

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


DBCP原理分析
            
    
    博客分类: commons_dbcp databasedbcpConnectionPool 
 

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


DBCP原理分析
            
    
    博客分类: commons_dbcp databasedbcpConnectionPool 
 


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

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

Email zqxjqka@gmail.com

  • DBCP原理分析
            
    
    博客分类: commons_dbcp databasedbcpConnectionPool 
  • 大小: 15.7 KB
  • DBCP原理分析
            
    
    博客分类: commons_dbcp databasedbcpConnectionPool 
  • 大小: 5.5 KB
  • DBCP原理分析
            
    
    博客分类: commons_dbcp databasedbcpConnectionPool 
  • 大小: 45.3 KB
  • DBCP原理分析
            
    
    博客分类: commons_dbcp databasedbcpConnectionPool 
  • 大小: 36.3 KB
  • DBCP原理分析
            
    
    博客分类: commons_dbcp databasedbcpConnectionPool 
  • 大小: 34.6 KB
  • DBCP原理分析
            
    
    博客分类: commons_dbcp databasedbcpConnectionPool 
  • 大小: 22.1 KB