当前位置:编程学习 > JSP >>

一种实现数据库连接池的方法(2)

答案:其次是连接池的工厂类ConnectionFactory,通过该类来将一个连接池对象与一个名称对应起来,使用者通过该名称就可以获取指定的连接池对象,具体代码如下:


/**
* 连接池类厂,该类常用来保存多个数据源名称合数据库连接池对应的哈希
* @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);
    }
    
}




ConnectionFactory主要提供了用户将将连接池绑定到一个具体的名称上以及取消绑定的操作。使用者只需要关心这两个类即可使用数据库连接池的功能。下面我们给出一段如何使用连接池的代码:


    String name = "pool";
    String driver = " sun.jdbc.odbc.JdbcOdbcDriver "

上一个:一种实现数据库连接池的方法(3)
下一个:一种实现数据库连接池的方法(1)

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,