您的位置:首页 > 运维架构 > Apache

Apache DBCP数据库连接池使用Demo

2016-03-29 19:34 387 查看

简介

Apache DBCP是一个封装良好数据库连接池。本文给出了一个配置文件Demo和连接池的单例封装。

连接池单例封装

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

import java.io.IOException;

import java.io.InputStream;

import java.sql.Connection;

import java.util.Properties;

import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSource;

import org.apache.commons.dbcp.BasicDataSourceFactory;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

/**

 * 连接池定义(对DPCP连接池进行包装以便对其进行单例控制),该类是单例模式(在应用程序中只能有一个实例)。

 * 配置文件为classpath:dbcp-config.properties

 * 

 */

public class DBCPConnectionPool {
// log
private static final Logger log = LoggerFactory.getLogger(DBCPConnectionPool.class);
// 用类变量来保存唯一实例
private volatile static DBCPConnectionPool uniqueInstance;
// DBCP连接池配置文件定义
private String configration = "/dbcp-config.properties";

//
private DataSource dataSource = null;

/* 构造器私有化,以确保不能随便创建该类的实例 */
private DBCPConnectionPool() {
try {
log.info("初始化DBCP连接池...");
init();
log.info("初始化DBCP连接池完毕.");
} catch (Exception e) {
log.error("初始化DBCP数据库连接池时出现异常[{}],程序退出。", configration, e);
System.exit(-1);
}
}

/**
* 使用者只能通过此方法获取 DBCPConnectionPool 的唯一实例。注意:当无法初始化数据库连接池时程序会退出.

* @return DBCPConnectionPool 的唯一实例
*/
public static DBCPConnectionPool getInstance() {
if (uniqueInstance == null) {
synchronized (DBCPConnectionPool.class) {
if (uniqueInstance == null) {
uniqueInstance = new DBCPConnectionPool();
}
}
}
return uniqueInstance;
}

/**
* 从连接池中获取一个数据库连接(Connection),此Connection是DBCP框架对原生连接进行封装过的。
* 获取的Connection使用完毕后要放回到连接池(通过调用Connection的close方法)

* @return Connection对象,使用完毕后要调用close方法以便将其放回到连接池
* @throws Exception
*             连接不能保证总能正确获取
*/
public Connection getConnection() throws Exception {
Connection conn = dataSource.getConnection();
printDataSource();
return conn;
}

/**
* 初始化方法,用于初始化DBCP连接池

* @throws Exception
*/
private void init() throws Exception {
Properties properties = createConfigrationProperties();
dataSource = BasicDataSourceFactory.createDataSource(properties);
}

/**
* 加载DBCP配置文件为 Properties 对象

* @return DBCP配置文件加载以后的 Properties 对象
* @throws Exception
*             文件不存在或读取错误时抛出异常
*/
private Properties createConfigrationProperties() throws Exception {
Properties properties = new Properties();
InputStream in = null;
try {
in = DBCPConnectionPool.class.getResourceAsStream(configration);
properties.load(in);
} catch (Exception e) {
throw e;
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
}
}
}
return properties;
}

/**
* 以debug等级打印当前连接池信息[当前活动连接、当前Idle连接]
*/
private static void printDataSource() {
StringBuffer poolInfo = new StringBuffer("");
BasicDataSource basicDataSource = (BasicDataSource) getInstance().dataSource;
poolInfo.append("连接池信息[");
poolInfo.append("numActive:");
poolInfo.append(basicDataSource.getNumActive());
poolInfo.append(", numIdle:");
poolInfo.append(basicDataSource.getNumIdle());
poolInfo.append("]");
log.debug(poolInfo.toString());
}
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

配置文件(dbcp-config.properties)定义Demo

###############################################################################################
#DBCP Connection pool configration

driverClassName=oracle.jdbc.driver.OracleDriver

url=jdbc:oracle:thin://@192.168.44.130/orcl

username=system

password=oracle

initialSize=10

maxActive=100

maxIdle=50

minIdle=10

maxWait=10000

validationQuery=select * from dual

#testOnBorrow

#testWhileIdle

#testOnReturn

#validationQueryTimeout

#timeBetweenEvictionRunsMillis

#numTestsPerEvictionRun

#defaultCatalog

#defaultTransactionIsolation

#defaultReadOnly

#defaultAutoCommit

###############################################################################################

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息