动态创建多个连接池

来源:互联网 发布:上海网络推广招聘 编辑:程序博客网 时间:2024/04/30 13:58
系统场景:系统依赖多个数据库。其中一台数据库服务器运行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;        }    }}