简介:

     DBCP,即Data Base Connection Pool:数据库连接池。它是apache上的一个java连接池项目,同时也是tomcat使用的连接池组件。使用DBCP会用到3个包:即commons-dbcp.jarcommons-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();

}

}

dbcp.properties文件:
driver=org.firebirdsql.jdbc.FBDriver
jdbc:firebirdsql:localhost /3050:D:/test.gdb
userName=SYSDBA
password=masterkey
initsize=5
maxactive=15
minidle=0
maxidle=10
maxwait=1000
removeabandoned=false
removeabandonedtimeout=180