/**
* 連接池類廠,該類常用來保存多個數據源名稱合數據庫連接池對應的哈希
* @author liusoft
*/
public class ConnectionFactory
{
//該哈希表用來保存數據源名和連接池對象的關系表
static Hashtable connectionPools = null;
static{
connectionPools = new Hashtable(2,0.75F);
}
/**
* 從連接池工廠中獲取指定名稱對應的連接池對象
* @param dataSource 連接池對象對應的名稱
* @return DataSource 返回名稱對應的連接池對象
* @throws NameNotFoundException 無法找到指定的連接池
*/
public static DataSource lookup(String dataSource)
throws NameNotFoundException
{
Object ds = null;
ds = connectionPools.get(dataSource);
if(ds == null || !(ds instanceof DataSource))
throw new NameNotFoundException(dataSource);
return (DataSource)ds;
}
/**
* 將指定的名字和數據庫連接配置綁定在一起并初始化數據庫連接池
* @param name 對應連接池的名稱
* @param param 連接池的配置參數,具體請見類ConnectionParam
* @return DataSource 如果綁定成功后返回連接池對象
* @throws NameAlreadyBoundException 一定名字name已經綁定則拋出該異常
* @throws ClassNotFoundException 無法找到連接池的配置中的驅動程序類
* @throws IllegalAccessException 連接池配置中的驅動程序類有誤
* @throws InstantiationException 無法實例化驅動程序類
* @throws SQLException 無法正常連接指定的數據庫
*/
public static DataSource bind(String name, ConnectionParam param)
throws NameAlreadyBoundException,ClassNotFoundException,
IllegalAccessException,InstantiationException,SQLException
{
DataSourceImpl source = null;
try{
lookup(name);
throw new NameAlreadyBoundException(name);
}catch(NameNotFoundException e){
source = new DataSourceImpl(param);
source.initConnection();
connectionPools.put(name, source);
}
return source;
}
/**
* 重新綁定數據庫連接池
* @param name 對應連接池的名稱
* @param param 連接池的配置參數,具體請見類ConnectionParam
* @return DataSource 如果綁定成功后返回連接池對象
* @throws NameAlreadyBoundException 一定名字name已經綁定則拋出該異常
* @throws ClassNotFoundException 無法找到連接池的配置中的驅動程序類
* @throws IllegalAccessException 連接池配置中的驅動程序類有誤
* @throws InstantiationException 無法實例化驅動程序類
* @throws SQLException 無法正常連接指定的數據庫
*/
public static DataSource rebind(String name, ConnectionParam param)
throws NameAlreadyBoundException,ClassNotFoundException,
IllegalAccessException,InstantiationException,SQLException
{
try{
unbind(name);
}catch(Exception e){}
return bind(name, param);
}
/**
* 刪除一個數據庫連接池對象
* @param name
* @throws NameNotFoundException
*/
public static void unbind(String name) throws NameNotFoundException
{
DataSource dataSource = lookup(name);
if(dataSource instanceof DataSourceImpl){
DataSourceImpl dsi = (DataSourceImpl)dataSource;
try{
dsi.stop();
dsi.close();
}catch(Exception e){
}finally{
dsi = null;
}
}
connectionPools.remove(name);
}
}
|