`
沙漠绿树
  • 浏览: 425293 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Oracle数据库链接池

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



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


0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics