动态创建多个连接池

系统场景:系统依赖多个数据库。其中一台数据库服务器运行ORACLE,同时还有数台机器上跑着ObjectServer内存数据库。由于到部署时才能确定从机的数量,因此需要动态创建连接池

方案:Oracle数据库用c3p0来管理连接池。另外写一个连接管理器来动态创建内存数据库连接池

代码:经过简化,只贴出关键代码,去掉日志、异常处理、null检查等
// ObejctServer连接池,系统中域的数量与该类实例一一对应 
public class DBConnectionPool
{
    private int checkedOut;// 已检出的连接数

    private Vector<Connection> freeConnections = new Vector<Connection>();// 空闲连接数

    // 返还连接
    public synchronized void freeConnection(Connection con, Object lock)
    {
        freeConnections.addElement(con);
        this.checkedOut--;
        lock.notifyAll();
    }

    // 从连接池中获取连接
    public Connection getConnection(Object lock)
    {
        Connection con;
        while ((con = fetchConnection()) == null)// 循环调用fetchConnection()方法
        {            
            lock.wait(timeout);// 没获取到可用连接,则等待
            // 如果超时了,则return null
        }
        return con;
    }
}

// ObjectServer连接管理器
public class DBConnectionManager
{
    private Hashtable<String, DBConnectionPool> pools;// 连接池集合,每个OS域都有一个连接池
   
    private static final byte[] lock = new byte[0];// 同步锁
        
    // 返还连接
    public void freeConnection(String domainName, Connection conn)
    {
        synchronized (lock)
        {         
            DBConnectionPool pool = (DBConnectionPool) pools.get(domainName);// 得到域名对应的连接池           
            pool.freeConnection(conn, lock);         
        }
    }

    // 获得某从机上的可用连接
    public Connection getConnection(String domainName)
    {
        synchronized (lock)
        {                     
            DBConnectionPool pool = (DBConnectionPool) pools.get(domainName);

            if (null != pool)// 连接池已存在,直接使用
            {
                return pool.getConnection(lock);           
            }
            else
            {
                registerNewConnectionPool(poolProvide);// 注册新连接池
                return getConnection(domainName);// 递归调用        
            }
            return null;
        }
    }
}

猜你喜欢

转载自kyfxbl.iteye.com/blog/1096632