方案: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; } } }