Apache DBCP数据库连接池使用Demo

来源:互联网 发布:unity3d解包工具 编辑:程序博客网 时间:2024/04/29 18:44

简介

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
###############################################################################################


0 1
原创粉丝点击