DBCP (DatabaseConnection Pool)是一个依赖Jakarta commons-pool对象池机制的数据库连接池,Tomcat的数据源使用的就是DBCP。目前 DBCP 有两个版本分别是 1.3 和 1.4。1.3 版本对应的是JDK 1.4-1.5 和 JDBC 3,而1.4 版本对应 JDK 1.6 和 JDBC 4。因此在选择版本的时候要看看你用的是什么 JDK 版本了,功能上倒是没有什么区别。
使用DBCP会用到3个包:即commons-dbcp.jar、commons-pool.jar、commons-collections.jar.
使用DBCP的好处:
建立数据库连接是一个非常消耗资源的行为,如当有一个数据访问操作时,需要创建一个连接,当这次服务访问完成后,这个连接虽然已关闭但是还没有被销毁,这样会耗内存。当下次再有需要数据访问的操作时程序又会创建连接,如此以往既消耗时间,又要消耗资源。所以最后就使用了一种节省资源的方式,即数据库连接池的方式。DBCP的工作原理是,程序首先会初始化相应的数据库连接池,以供程序访问,当某个操作需要访问数据库时,程序会首先在连接池中取得空闲连接,如没有空闲连接在创建,用完之后归还连接池,这样达到了连接的重利用,不用频繁的创建连接和销毁,从而优化程序。
常见属性:
driver:数据库驱动,如com.mysql.jdbc.Driver
url:数据库连接,如jdbc:mysql://localhost:3306/testDB
username:数据库用户名,如root
password:数据库用户名口令,如root
initsize:初始化连接池大小
minidle:最小空闲连接
maxidle:最大空闲连接
它表示的是如果在并发的情况下,达到了maxidle=15一下面配置为例,这时连接池就必须从数据库中获取15个连接来供应程序使用,当应用连接关闭之后,由于maxikle=10并不是所有的连接都归还给了数据库,将会有10连接保存在连接池中,这时的状态就是空闲。
maxactive:最大连接,表示在并发情况下最大能从数据连接池中获取的连接数
maxwait:最大等待时间
removeabandoned:是否自动回收超时连接,boolean类型(true/false)
在dbcp库1.2.2之后有新的支持,在这个版本中表示此属性已过期。
removeabandonedtimeout:超时时间,以秒为单位
示例(Java操作):
package com.wgy.dbcp;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
importorg.apache.commons.dbcp.BasicDataSource;
public class DBCPTest {
// 连接驱动
private static String DRIVER_CLASS =null;
// 连接地址
private static String URL = null;
// 数据库用户名
private static String USER_NAME =null;
// 数据库口令
private static String PASSWORD =null;
protected Connection conn = null;
protected PreparedStatement ps =null;
protected ResultSet rs = null;
// 初始化连接
private static int initSize;
// 最大连接数
private static int maxActive;
// 最小空闲连接
private static int minIdle;
// 最大空闲连接
private static int maxIdle;
// 最大等待时间
private static int maxWait;
// 等待超时是否自动回收超时连接
private static booleanremoveAbandoned;
// 超时时间
private static intremeoveAbandonedTimeout;
// 是否事物提交
private static booleandefaultAutocommit;
// 对于数据库是否只能读取
private static booleandefaultReadonly;
// 创建数据库连接对象(数据源)
private static BasicDataSourcedataSource = new BasicDataSource();
// 配置数据源
static {
setProperty();
DataSourceConfig();
}
/**
* 读取配置文件,并设置数据库连接池的属性
*/
private static void setProperty() {
// 创建配置文件对象
Properties props = new Properties();
// 获得配置文件输入流对象
InputStream input = DBCPTest.class
.getResourceAsStream("/dbcp.properties");
try {
/