📄 dbconnectionmanager.java
字号:
package com.tongtu.comm.sql;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.*;
/**
* JDBC数据库连接管理类。<p>
*
* @author irevin
* @version 1.0
*/
public class DBConnectionManager{
//静态实例,Singleton
private static DBConnectionManager instance;
//数据库连接池
//private DBConnectionPool pool;
//取静态实例的次数
private static int clients;
//JDBC驱动集
private Vector drivers = new Vector();
//连接池集
private Hashtable pools;
//日志,暂时不加
//private final static Logger log = Logger.getInstance("DBConnectionManager");
/**
* 构造方法。
*/
private DBConnectionManager(){
//调用初始化方法
init();
}
/**
* 取实例。
*
* @return DBConnectionManager的唯一实例
*/
public static synchronized DBConnectionManager getInstance(){
if(null == instance){
//如果实例为空,则新建之
instance = new DBConnectionManager();
}
clients++;
//-=----------------------
//log.debug("dbm numbers: " + clients);
//返回静态实例
return instance;
}
/**
* 取数据库连接。
*
* @param poolName 连接池名
* @return 数据库连接或null
* @throws SQLException SQL异常
*/
public Connection getConnection(final String poolName)
throws SQLException{
//从连接池集中取给定名字的连接池;
final DBConnectionPool pool = (DBConnectionPool) pools.get(poolName);
if(null != pool){
//如果该连接池不为null,则从该池中取一个数据库连接并返回
return pool.getConnection();
}
//否则返回null
return null;
}//end getConncetion()
/**
* 取数据库连接。
*
* @param poolName 连接池名
* @param timeOut 等待时限(毫秒)
* @return 数据库连接或null
* @throws SQLException SQL异常
*/
public Connection getConnection(final String poolName,final long timeOut)
throws SQLException{
//从连接池集中取给定名字的连接池
final DBConnectionPool pool = (DBConnectionPool) pools.get(poolName);
if(null != pool){
//如果该连接池不为null,则从该池中取一个数据库连接并返回
return pool.getConnection(timeOut);
}
//否则返回null
return null;
}//end getConncetion()
/**
* 将数据库连接对象返回指定名字的数据库连接池中。
*
* @param conn 数据库连接
* @param poolName 数据库连接池名
* throws SQLException SQL异常
*/
public void freeConnection(final Connection conn,final String poolName){
//从连接池集中取给定名字的连接池
final DBConnectionPool pool = (DBConnectionPool) pools.get(poolName);
if(null != pool){
//将给定连接返回连接池
pool.freeConnection(conn);
this.clients--;
}
}//end freeConncetion()
/**
* 初始化。
*/
private void init(){
//配置类
final Configuration cfg = Configuration.getInstance();
final Properties prop = cfg.getPorperties();
final String strDrivers = cfg.getValue("DRIVERS");
//装载并注册JDBC驱动
loadDrivers(strDrivers);
//创建连接池
createPools(prop);
//预建连接
/*try{
getConnection("DB");
} catch(SQLException e){
log.debug(e.getMessage());
}*/
}//end init()
/**
* 装载和注册所有的JDBC驱动。
*
* @param Drivers JDBC驱动名字串
*/
private void loadDrivers(final String Drivers){
//驱动集合
//String driverClasses = Drivers;
//按空格区分
final StringTokenizer st = new StringTokenizer(Drivers);
//注册和装载每个驱动
while(st.hasMoreElements()){
//驱动名
final String driverClassName = st.nextToken().trim();
try{
//装载
final Driver driver = (Driver) Class.forName(driverClassName).newInstance();
//注册
DriverManager.registerDriver(driver);
//标记
this.drivers.addElement(driver);
//log
//log.info("Driver Registed...");
} catch(Exception e){
//log...
//log.error("loadDrivers error: " + e.getMessage());
}//end try...catch...
}//end while
}//end loadDrivers()
/**
* 创建连接池。
*
* @param prop 属性对象
*/
private void createPools(final Properties prop){
pools = new Hashtable();
//属性名
final Enumeration propNames = prop.propertyNames();
//循环创建每个连接池
while(propNames.hasMoreElements()){
//属性名
final String name = (String) propNames.nextElement();
//如果是.URL结尾,即是连接属性时
if(name.endsWith(".URL")){
//连接池名
final String poolName = name.substring(0, name.lastIndexOf("."));
//连接URL
final String strURL = prop.getProperty(poolName + ".URL");
if(null == strURL){
//如果URL为null,则执行下一循环
//log("没有为连接池" + poolName + "指定URL");
continue;
}//end if...strURL = null?
//用户名
final String strUser = prop.getProperty(poolName + ".USER");
//密码
final String strPassword = prop.getProperty(poolName + ".PASSWORD");
//最大连接数,无则为0
final String strMaxConn = prop.getProperty(poolName + ".MAX_CONNECTIONS", "0");
int maxConn;
try{
//转成int
maxConn = Integer.valueOf(strMaxConn).intValue();
} catch(NumberFormatException e){
//有异常,则设置最大连接数为0
//TODO:?IS SET TO DEFAULT
//log("错误的最大连接数限制: " + maxConn + " .连接池: " + poolName);
//log.error("createPools error: " + e.getMessage());
maxConn = 0;
}//end try...catch...
//创建连接池
final DBConnectionPool pool = new DBConnectionPool(poolName, strURL, strUser, strPassword, maxConn);
//
//log.info("Pool\"" + poolName + "\" created...");
try{
//登记
this.pools.put(poolName, pool);
} catch(Exception e){
//log.error("createPools add pool error: " + e.getMessage());
}
}//end if
}//end while
}//end createPools()
/**
* 释放资源。
*/
public synchronized void release(){
//如果有客户程序在使用,则返回
//todo:this.clients--;
if(--this.clients != 0){
//log.debug("clients : " + clients);
return;
}
//所有连接池
final Enumeration allPools = this.pools.elements();
//循环释放每个连接池
while(allPools.hasMoreElements()){
//连接池
final DBConnectionPool pool = (DBConnectionPool) allPools.nextElement();
//释放
pool.release();
//log.info("Pools release...");
}//end while
//所有登记的驱动
Enumeration allDrivers = this.drivers.elements();
//循环注销登记的驱动
while(allDrivers.hasMoreElements()){
//驱动
Driver driver = (Driver) allDrivers.nextElement();
try{
//注销
DriverManager.deregisterDriver(driver);
//log.info("Drivers deregisted...");
} catch(Exception e){
//log.error("release error: " + e.getMessage());
}//end try...catch...
}//end while
}//end release()
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -