Oracle数据库链接池

[quote][size=x-small] 很多时候我们都要操作数据库,高效数据库操作的第一步就是在数据库连接上面,要体现高效,数据库连接池就不可少的了。以下是我工程使用的oracle9i以上版本的数据库连接池。使用的oracle连接jar包在附件中,SlcxLogger.java类在我之前的博客《log4j介绍、配置与使用》中。[/size][/quote]



import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

import org.apache.log4j.Logger;

import com.slcx.log.SlcxLogger;

import oracle.jdbc.pool.OracleConnectionCacheManager;
import oracle.jdbc.pool.OracleDataSource;

/**
* Oracle数据库链接池。
*
* @作者 华龙
*
* @日期 2010-01-05
*/
public class OraConnPool {

//是否初始化
private static boolean initStatus = false;
//连接数据源
private static OracleDataSource orads = null;
//连接池日志
private static Logger logger=SlcxLogger.getLogger(OraConnPool.class);


public synchronized static Connection getConnection() {
// 加载默认的配置,配置文件跟类文件在同意一个包
return getConnection(null);

// 加载自定义的配置
// return getConnection("./config/connpool.properties");
}

public static Connection getConnection(String properties) {
if (initStatus == false) {
initial(properties);
}
Connection conn = null;

if (orads != null) {
try {
conn = orads.getConnection();
} catch (SQLException e) {
logger.error("获取一个数据库连接异常",e);
}
}

while (conn == null) {
try {
Thread.sleep(1000*10);
} catch (InterruptedException e) {
logger.error("连接池线程休眠异常",e);
}

initial(properties);

try {
conn = orads.getConnection();
} catch (SQLException e) {
logger.error("获取一个数据库连接异常",e);
}
}

// try {
// OracleConnectionCacheManager occm = OracleConnectionCacheManager
// .getConnectionCacheManagerInstance();
// logger.debug("得到 slcx 缓存中激活的连接:"
// + occm.getNumberOfActiveConnections("slcx") + " 可用的链接:"
// + occm.getNumberOfAvailableConnections("slcx") + " 线程的编号:"
// + Thread.currentThread().getId());
// } catch (Exception e) {
// logger.error("输出连接池信息错误", e);
// }

return conn;
}

/**
* 初始化数据库连接池数据源
*/
public static void initial(String properties) {
//关闭ORA数据库链接数据源
if (orads != null) {
try {
orads.close();
} catch (Exception e) {
logger.info("关闭数据源异常",e);
}
orads = null;
}

try {
Properties props = new Properties();
if(properties!=null){
//加载默认数据连接池配置文件。
props.load(new FileInputStream(properties));
}
else{
//加载自定义数据连接池配置文件。
props.load(OraConnPool.class.getResourceAsStream("connpool.properties"));
}

//获取数据库连接池:链接URL,账号,密码
String url = props.getProperty("url");
String username = props.getProperty("username");
String password = props.getProperty("password");


orads = new OracleDataSource();
//设置数据库连接池:链接URL,账号,密码
orads.setURL(url);
orads.setUser(username);
orads.setPassword(password);


//设置连接缓存是否可用,这里设置true
orads.setConnectionCachingEnabled(true);
//设置其他连接缓存配置
orads.setConnectionCacheProperties(props);


//为连接池的高速缓存取个名字
orads.setConnectionCacheName("slcx");

initStatus = true;
} catch (Exception e) {
initStatus = false;
logger.error("初始ORACLE数据源异常",e);
}
}


/**
* 关闭各种有关数据库操作对象
* @param rs 结果集对象
* @param stmt SQL处理对象
* @param conn 数据连接对象
*/
public static void closeAll(ResultSet rs,Statement stmt,Connection conn){
try {
if(rs!=null){
rs.close();
rs=null;
}
} catch (Exception e) {
logger.error("关闭查询结果对象异常",e);
}
try {
if(stmt!=null){
stmt.close();
stmt=null;
}
} catch (Exception e) {
logger.error("关闭处理SQL语句对象异常",e);
}
try {
if(conn!=null){
conn.close();
conn=null;
}
} catch (Exception e) {
logger.error("关闭数据库连接异常",e);
}
}

public static void main(String[] args) {
Connection conn = getConnection();

long start = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
conn = getConnection();
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
long end = System.currentTimeMillis();

System.out.println((end - start));
}
}


// 配置文件名“connpool.properties”,具体内容如下:


#数据库链接URL
url=dbc:oracle:thin:@192.168.0.8:1521:slcx
#数据库链接用户名和密码
username=用户名
password=密码

#url=dbc:oracle:thin:@10.0.0.14:1521:fetch
#username=用户名
#password=密码

#初始连接数大小
InitialLimit=2
#最小连接数
MinLimit=2
#最大链接数
MaxLimit=20
#不活动的超时时间
InactivityTimeout=1800
#被抛弃的链接超时
AbandonedConnectionTimeout=900
#属性检查相隔时间
PropertyCheckInterval=60
#链接等待超时时间
ConnectionWaitTimeout=100
#高速缓存的名称
ConnectionCacheName=slcx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值