在阅读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数据库连接池需要用到的jar,包括源码和api文档,javadoc
常见的两种数据库连接池的jar包和源码。
NULL 博文链接:https://xiongjiajia.iteye.com/blog/1295094
JAVA数据库连接池(C3P0,Druid,JNDI ,DBCP,Proxool,BoneCP) 源码包含各个数据库连接池的连接DEMO spring+mybatis+maven
DBCP(DataBase connection pool),数据库连接池。是 apache 上的一个 java 连接池项目,也是 tomcat 使用的连接池组件。单独使用dbcp需要3个包:common-dbcp.jar,common-pool.jar,common-collections.jar由于建立...
这个类就是利用了DBCP包写数据库连接池。 4.ISqlHelper.java 其实这个接口也很简单,定义了那么几个方法,说白了就是操作数据库的,为什么要写成泛型的接口,为了就是后面大家的业务有针对性,一个实体一个业务...
Java JDBC基本入门知识,带增删改查例子,支持MySql数据库,...有利于初学者理解Java是怎么连接和操作数据库的,也是慕课网中 JDBC之对面女孩走过来的实例源码,亲测有效,跟着视频自己敲的,视频上的功能都能实现。
NULL 博文链接:https://java--hhf.iteye.com/blog/2171051
Java JDBC基本内容,带增删改查例子,支持MySql数据库,支持...有利于初学者理解数据库和Java的连接,还有连接池的两个小demo,也是慕课网上 JDBC之对面的女孩走过来这个项目的源码,实测可用,和课程上的效果一样。
NULL 博文链接:https://housheng33.iteye.com/blog/1522705
基于tomcat的dbcp使用 博文链接:https://wuxw920.iteye.com/blog/1045562
NULL 博文链接:https://hb-yym-929.iteye.com/blog/1395675
DBCP的工作原理是,程序首先会初始化相应的数据库连接池,以供程序访问,当某个操作需要访问数据库时,程序会首先在连接池中取得空闲连接,如没有空闲连接在创建,用完之后归还连接池,这样达到了连接的重利用,不用...
NULL 博文链接:https://chengjianxiaoxue.iteye.com/blog/2077497
运用数据库连接池要用到的三个jar包, 以及源码和帮助文档。
dbcp 1.4 jar 和 源码 数据库连接池,只适用于JDK1.6
Apache DBCP1.4源码.对于数据库数据不停的读取和更改,频繁的建立Connection是很不划算,建立连接池是很好的选择
NULL 博文链接:https://381324504-qq-com.iteye.com/blog/486480
NULL 博文链接:https://iihero.iteye.com/blog/1266470
数据库连接池:DBCP 数据库连接池 WEB 容器:Tomcat 存储数据库:SQL Server 数据库 (最熟悉) 生产服务环境:Windows 10 (最熟悉) 详细介绍参考:...