简介:
DBCP,即Data Base Connection Pool:数据库连接池。它是apache上的一个java连接池项目,同时也是tomcat使用的连接池组件。使用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;
import org.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 boolean removeAbandoned;
// 超时时间
private static int remeoveAbandonedTimeout;
// 是否事物 提交
private static boolean defaultAutocommit;
// 对于数据库是否只能读取
private static boolean defaultReadonly;
// 创建数据库连接对象(数据源)
private static BasicDataSource dataSource = new BasicDataSource();
// 配置数据源
static {
setProperty();
DataSourceConfig();
}
/**
* 读取配置文件,并设置数据库连接池的属性
*/
private static void setProperty() {
// 创建配置文件对象
Properties props = new Properties();
// 获得配置文件输入流对象
InputStream input = DBCPTest.class
.getResourceAsStream("/dbcp.properties");
try {
// 将文件读取到内存中
props.load(input);
// 根据键获得值
DRIVER_CLASS = props.getProperty("driver");
System.out.println(props.getProperty("driver"));
props.getProperty("url");< /font>
USER_NAME = props.getProperty("userName");
PASSWORD = props.getProperty("password");
initSize = Integer.parseInt(props.getProperty("initsize"));
maxActive = Integer.parseInt(props.getProperty("maxactive"));
minIdle = Integer.parseInt(props.getProperty("minidle"));
maxIdle = Integer.parseInt(props.getProperty("maxidle"));
maxWait = Integer.parseInt(props.getProperty("maxwait"));
removeAbandoned = Boolean.parseBoolean(props
.getProperty("removeabandoned"));
remeoveAbandonedTimeout = Integer.parseInt(props
.getProperty("removeabandonedtimeout"));
defaultAutocommit = Boolean.parseBoolean(props
.getProperty("defaultautocommit"));
defaultReadonly = Boolean.parseBoolean(props
.getProperty("defaultreadonly"));
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
input.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 设置dataSource各属性值
*/
private static void DataSourceConfig() {
// 设置数据库驱动
dataSource.setDriverClassName(DRIVER_CLASS);
// 设置URL地址
dataSource.setURL);< /font>
// 设置用户名
dataSource.setUsername(USER_NAME);
// 设置用户口令
dataSource.setPassword(PASSWORD);
// 初始化连接
dataSource.setInitialSize(initSize);
// 设置最大连接数
dataSource.setMaxActive(maxActive);
// 设置最小空闲连接
dataSource.setMinIdle(minIdle);
// 设置最大空闲连接
dataSource.setMaxIdle(maxIdle);
// 设置最大等待时间
dataSource.setMaxWait(maxWait);
// 设置是否自动回收
dataSource.setRemoveAbandoned(removeAbandoned);
// 设置超时时间
dataSource.setRemoveAbandonedTimeout(remeoveAbandonedTimeout);
// 设置是否事物提交值
dataSource.setDefaultAutoCommit(defaultAutocommit);
// 设置对于数据库是否只读
dataSource.setDefaultReadOnly(defaultReadonly);
}
/**
* 获得连接对象
*
* @return
*/
public Connection getConn() {
try {
// 从连接池中获得连接对象
if (conn == null) {
conn = dataSource.getConnection();
}
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
public ResultSet executeQuery(String sql, Object[] params) throws Exception {
ps = getConn().prepareStatement(sql);
if (params != null && params.length > 0) {
for (int i = 0; i < params.length; i++) {
ps.setObject(i + 1, params[i]);
}
}
return ps.executeQuery();
}
}