数据库连接池多种多样,不得不提到的是代码短小精悍性能又不错的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
相关推荐
### DBCP连接池原理分析 #### DBCP概述与版本区分 DBCP(Database Connection Pool)是由Apache组织提供的一款开源连接池实现。它能够帮助应用程序有效地管理与数据库的连接资源,通过重用预创建的数据库连接来...
《Apache Commons DBCP2 2.0.1 源码分析》 Apache Commons DBCP2(DBCP第二版)是Apache软件基金会提供的一款开源数据库连接池组件,主要用于管理数据库连接,提高应用程序的效率和性能。在版本2.0.1中,DBCP2已经...
这个源码包"commons-dbcp-1.2.2-src"包含了DBCP 1.2.2版本的所有源代码,对于学习和理解数据库连接池的工作原理非常有帮助。 在深入源码之前,我们先了解DBCP的基本概念和功能: 1. 数据库连接池:DBCP的核心就是...
1. **数据库连接池原理**: 数据库连接池在初始化时会创建一定数量的数据库连接并存入池中,这些连接可以在多个请求之间共享。当应用程序需要连接数据库时,它会从池中获取一个已存在的连接,而不是每次都去创建新...
总的来说,DBCP-1.2.2是理解数据库连接池工作原理和Java数据访问的一个良好起点。通过阅读源码,开发者可以学习到如何实现连接池,以及在设计和优化类似组件时需要考虑的关键点。同时,了解它的局限性也有助于选择更...
源码分析对于理解其工作原理和优化应用至关重要。在"commons-dbcp-1.2.2源码"中,我们可以深入探讨以下几个关键知识点: 1. **数据库连接池的概念**:数据库连接池是一种在初始化阶段创建一定数量的数据库连接,并...
4. **源码分析** - `commons-dbcp-1.4-bin.zip` 包含了DBCP的编译后的JAR文件,供应用程序直接使用。 - `commons-dbcp-1.4-src.zip` 提供了DBCP的源代码,可以用于学习其内部实现,进行调试或定制修改。 5. **...
至于“源码”标签,可能意味着这篇博客或文档会涉及对DBCP的源代码分析,帮助开发者理解其内部工作机制,这对于进行性能调优或定制功能非常有帮助。 “工具”标签则表明DBCP是一个实用的工具,可以在许多Java应用中...
总的来说,理解并掌握DBCP2和Pool2的原理和使用,对于开发高可用、高并发的Java Web应用至关重要。这两个组件的正确配置和使用,不仅可以提高数据库访问的效率,还能有效管理资源,降低系统开销,是Java开发人员必须...
DBCP1.4源码分析可以帮助我们深入理解其工作原理,从而更好地在实际项目中应用和优化。 DBCP基于Jakarta Pool,实现了JDBC连接池功能。它包含以下几个核心组件: 1. **BasicDataSource**: 这是DBCP的主要类,它...
下面将详细介绍这三个连接池的工作原理、特性以及如何进行性能测试。 1. **DBCP (BasicDataSource)** - **简介**:DBCP是Apache Commons的一个子项目,提供了一个基于 Jakarta POOL 的数据库连接池实现。 - **...
源代码是开发者研究、学习和定制软件的基础,通过分析源码,我们可以深入理解DBCP的工作原理,了解其内部设计模式和最佳实践。 DBCP主要提供了以下功能: 1. **连接池管理**:DBCP能够创建和维护一个数据库连接池...
数据库连接池的工作原理是:当一个数据库连接被请求时,DBCP会从已建立的连接池中分配一个已经存在的连接,而不是每次请求时都创建新的连接。用完后,连接不会立即关闭,而是返回到连接池,等待其他线程重复使用。这...
标签中的“源码”可能意味着这篇教程会涉及到DBCP的内部实现,讲解如何通过阅读源代码来理解其工作原理。而“工具”标签表明DBCP是作为开发工具的一部分,用于支持应用程序的数据库访问。 在压缩包“day18_2”中,...
这个特性对于那些需要处理多种数据库的应用来说非常有用,例如数据集成、数据迁移或多数据源分析等场景。以下是对这个封装的DBCP连接池的一些关键知识点的详细说明: 1. **数据库连接池原理**:数据库连接池的核心...
这三种驱动程序各自有其特点和优势,下面将详细阐述它们的原理、使用方法以及适用场景。 1. C3P0 C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。C3P0的主要特性包括: ...
课程可能还包括数据库设计案例分析,例如银行系统、电商网站、图书馆管理系统等,帮助学生将理论知识与实践相结合,提升解决实际问题的能力。此外,性能调优也是数据库管理员的重要技能,包括索引优化、查询优化、...
1. **选择连接池实现**:首先,我们需要选择一个合适的数据库连接池实现,如Apache的DBCP、C3P0、HikariCP或Tomcat JDBC连接池等。这些连接池库提供了管理和维护数据库连接的功能。 2. **配置连接池**:在应用的...
首先,让我们了解数据库连接池的基本原理。数据库连接池在初始化时会创建一定数量的数据库连接,这些连接在应用程序需要时被复用,而不是每次请求都创建新的连接。当连接不再使用时,会被放回池中,供后续请求使用,...