浏览 2164 次
锁定老帖子 主题:动态创建多个连接池
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-06-17
最后修改:2011-06-17
方案: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; } } } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |