在阅读DBCP源码前得先阅读commons-pool的原源码。
下面是几个主要的类的关系图。
1、BasicDataSource是我们最常见的类,配置数据源的时候就是写的这个。
它里面有一个getConnection方法,每次调用时就是从连接池中获取Connection。
具体的实现方法是在PoolingDataSource.java中,源码中如下:
public Connection getConnection() throws SQLException {
try {
Connection conn = (Connection)(_pool.borrowObject());
if (conn != null) {
conn = new PoolGuardConnectionWrapper(conn);
}
return conn;
} catch(SQLException e) {
throw e;
} catch(NoSuchElementException e) {
throw new SQLNestedException("Cannot get a connection, pool error " + e.getMessage(), e);
} catch(RuntimeException e) {
throw e;
} catch(Exception e) {
throw new SQLNestedException("Cannot get a connection, general error", e);
}
}
里面的_pool.borrowObject();就是从池中获取对象。
2、接着看PoolableConnectionFactory.java 这个就是commons-pool需要我们实现的创建池化对象的工厂类。
public Object makeObject() throws Exception {
Connection conn = _connFactory.createConnection();
if (conn == null) {
throw new IllegalStateException("Connection factory returned null from createConnection");
}
initializeConnection(conn);
if(null != _stmtPoolFactory) {
KeyedObjectPool stmtpool = _stmtPoolFactory.createPool();
conn = new PoolingConnection(conn,stmtpool);
stmtpool.setFactory((PoolingConnection)conn);
}
return new PoolableConnection(conn,_pool,_config);
}
这段代码就是调用ConnectionFactory创建连接对象的方法,并且返回的是封装好的PoolableConnection类。
3、最后看PoolingConnection.java 中的close方法。
public synchronized void close() throws SQLException {
if (_closed) {
return;
}
boolean isUnderlyingConectionClosed;
try {
isUnderlyingConectionClosed = _conn.isClosed();
} catch (SQLException e) {
try {
_pool.invalidateObject(this);
} catch(IllegalStateException ise) {
passivate();
getInnermostDelegate().close();
} catch (Exception ie) {
}
throw (SQLException) new SQLException("Cannot close connection (isClosed check failed)").initCause(e);
}
if (!isUnderlyingConectionClosed) {
try {
_pool.returnObject(this);
} catch(IllegalStateException e) {
passivate();
getInnermostDelegate().close();
} catch(SQLException e) {
throw e;
} catch(RuntimeException e) {
throw e;
} catch(Exception e) {
throw (SQLException) new SQLException("Cannot close connection (return to pool failed)").initCause(e);
}
} else {
try {
_pool.invalidateObject(this); // XXX should be guarded to happen at most once
} catch(IllegalStateException e) {
// pool is closed, so close the connection
passivate();
getInnermostDelegate().close();
} catch (Exception ie) {
}
throw new SQLException("Already closed.");
}
}
最后这个close方法里面是把对象给return到pool中。
看到这里,在使用DBCP时还是得调用close方法一下,把连接还给pool。

- 大小: 65.7 KB
分享到:
相关推荐
DBCP(Database Connection Pool)是Apache Commons项目中的一个数据库连接池组件,主要目的是为了提高数据库连接的复用性,减少创建和销毁连接的开销,从而提升应用的性能。DBCP2是其第二个主要版本,提供了更稳定...
数据库连接池是Java应用程序中非常重要的一个组件,它在处理...总之,这份源码提供了一个学习数据库连接池实现的实例,通过深入研究,可以加深对数据库连接池工作原理的理解,并有助于在实际项目中优化数据库访问性能。
**数据库连接池(DBCP)** 是一个在Java应用程序中管理数据库连接的工具,它能够有效地提高数据库操作的性能和效率。DBCP全称为`Jakarta Commons DBCP`,是Apache软件基金会的一个项目,提供了对数据库连接的池化...
c3p0和DBCP(BasicDataSource)是两个广泛应用的开源数据库连接池实现。 c3p0是一个完全开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。c3p0-0.9.5.2.jar包含了c3p0的运行时库,而...
本资源包含了一个名为`jdbcPool`的手写数据库连接池源码以及一个`jdbcPoolTest`的调用示例,支持Oracle和MySQL数据库。 首先,我们来看`jdbcPool`连接池的实现。在Java中,连接池通常由以下几个核心组件组成: 1. ...
在Java中,有多种流行的数据库连接池实现,如Apache的DBCP、C3P0,以及HikariCP等。以HikariCP为例,它被广泛认为是性能最佳的连接池,因为它提供了快速的连接获取和释放,以及低延迟的特性。 使用数据库连接池的...
在实际项目中,开发者通常会使用成熟的数据库连接池实现,如Apache的DBCP、C3P0或HikariCP,这些库提供了更全面的功能和更好的性能优化。但了解如何自定义连接池可以帮助我们更好地理解数据库连接池的工作原理,从而...
常见的数据库连接池实现有Apache的DBCP、C3P0,以及HikariCP等。其中,HikariCP以其优秀的性能和稳定性受到广泛欢迎,它的设计理念是“快速失败”和“快速恢复”,提供了极低的连接创建和销毁开销,以及高效的连接...
相比其他流行的数据库连接池,如DBCP、HikariCP、Druid等,c3p0在某些方面可能稍显落后,例如性能和内存占用。但其丰富的配置选项和良好的兼容性仍使其在某些场景下成为不错的选择。例如,对于小型项目或对性能要求...
在Java开发中,常见的数据库连接池工具有C3P0、DBCP、HikariCP、Druid等。本文推荐的“简单而实用的数据库连接池工程”可能是指Druid,因为Druid是一个非常受欢迎的开源连接池实现,由阿里巴巴开源社区提供,以其...
2. DBCP (Apache BasicDataSource):Apache Commons的一个子项目,它是基于Jakarta Pool实现的数据库连接池。 3. HikariCP:一款高性能的Java JDBC连接池,以其极低的空闲连接内存占用和快速的连接创建速度而闻名。 ...
DBCP(Database Connection Pool)是Apache Commons的一个子项目,提供了数据库连接池的实现。本篇文章将详细介绍如何使用DBCP来创建一个针对MySQL数据库的连接池。 首先,我们需要了解DBCP的基本概念。DBCP全称为...
在实际应用中,有许多著名的数据库连接池实现,例如Apache的DBCP、C3P0,以及HikariCP等。它们各有特点,比如HikariCP以其高性能和低延迟著称,而C3P0则提供了丰富的配置选项和优秀的异常处理机制。 总结来说,使用...
本文将深入探讨数据库连接池的基础知识,特别是关于DBCP(Jakarta Commons DBCP)和C3P0两个流行的连接池实现。 首先,让我们了解什么是数据库连接池。数据库连接池是在应用服务器启动时创建的一组预定义的数据库...
在Java中,常见的数据库连接池实现有C3P0、Apache DBCP、HikariCP等。本文将介绍一个简单的自定义数据库连接池实现,主要涉及以下几个核心组件: 1. **连接池配置**:定义连接池的大小、超时时间、数据库连接参数...
Apache DBCP(Database Connection Pool)是Apache组织提供的一款开源的数据库连接池组件,它能够有效地管理和优化数据库连接,提高应用程序的性能和效率。在Java应用程序中,使用DBCP可以帮助我们减少频繁创建和...
Apache Commons DBCP,全称为“Database Connection Pool”,是Apache软件基金会下的一个开源项目,用于提供数据库连接池的实现。数据库连接池在Java应用程序中扮演着至关重要的角色,它能够有效地管理和复用数据库...
NULL 博文链接:https://xiongjiajia.iteye.com/blog/1295094
BoneCP 是由 Jeff Smith 创建的一个开源数据库连接池,它设计的目标是提供比 C3P0 和 DBCP 更高的性能。其官方主页提供详细的文档和下载信息,API 文档则包含了所有类和接口的详细说明,便于开发者使用和集成。 2....
在Java开发中,常见的数据库连接池实现有三种:C3P0、DBCP和HikariCP。下面将详细介绍这三种数据库连接池的工作原理和特点。 1. C3P0 C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2...