动态创建多个连接池
系统场景:系统依赖多个数据库。其中一台数据库服务器运行ORACLE,同时还有数台机器上跑着ObjectServer内存数据库。由于到部署时才能确定从机的数量,因此需要动态创建连接池
方案:Oracle数据库用c3p0来管理连接池。另外写一个连接管理器来动态创建内存数据库连接池
代码:经过简化,只贴出关键代码,去掉日志、异常处理、null检查等
// 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; } }}