/* * Copyright (C) Jackliu * <a href="mailto: "></a> * WWWCNJAVACOM All Rights Reserved */ package javadatabase; import javautil*; import javasql*; /** * <font size=><b>数据库连接池</b></font> * <font color=gray>这个类为系统提供一个数据库的连接池</font> * <br><br> * @see Sys_config * @author <a href="mailto: ">Jackliu</a> */ public class DBPoolsManager{ static private DBPoolsManager instance; // 唯一实例 DBPools pools; Driver theDrv; /** * 构造方法 * <br>创建数据库连接池(oracle OCI) */ private DBPoolsManager(){ /* use oracle OCI*/ String url = "jdbc:oracle:oci:@"+Sys_configgetDATABASE_INSTANCE(); String user = Sys_configgetDATABASE_USERID(); String password = Sys_configgetDATABASE_USERPWD(); int max = IntegerparseInt(Sys_configgetDATA_SESSION()); try{ /*use mysql driver theDrv = new orggjtmmmysqlDriver();*/ /*use oracle driver*/ theDrv = new oraclejdbcdriverOracleDriver(); DriverManagerregisterDriver(theDrv); } catch ( SQLException e ){ //debug to errlog eprintStackTrace(Systemerr); } pools = new DBPools(url user password max); poolsshowDetail(); } /** * 得到一个数据库的连接池管理的实例 * @return 返回一个数据库连接池管理的一个实例 */ static synchronized public DBPoolsManager getInstance(){ if (instance == null){ instance = new DBPoolsManager(); } return instance; } /** * 从数据库连接池中获取一个空闲的数据库连接实例 * <br>如果超出连接池的最大连接返回一个空的对象 * @return 返回一个数据库连接对象 */ public Connection getConnection(){ return poolsgetConnection(); } /** * 释放一个正在工作的数据库连接到数据库连接池 * @param con Connection 一个数据库连接 */ public void freeConnection(Connection con){ poolsfreeConnection(con); } /** * 关闭数据库连接池 */ public void close(){ try{ poolsshowDetail(); poolsclose(); DriverManagerderegisterDriver(theDrv); } catch ( SQLException e ){ //debug to errlog eprintStackTrace(Systemerr); } } class DBPools{ private Vector freeConnections = new Vector(); private Vector currentConnections = new Vector(); private int maxConn; private String URL; private String password; private String user; /** * 构造函数 * <br>创建一个数据库连接池 * @param URL String JDBC URL * @param user String User id || null * @param password String User pwd ||null * @param maxConn int Max connect */ public DBPools(String URL String user String password int maxConn){ thisURL = URL; thisuser = user; thispassword = password; thismaxConn = maxConn; } /** * 释放一个正在工作的数据库连接到数据库连接池 * @param con Connection 一个数据库连接 */ public synchronized void freeConnection(Connection con){ //remove from freeConnection vector currentConnectionsremove(con); freeConnectionsadd(con); } /** * 从连接池获得一个可用连接如没有空闲的连接且当前连接数小于最大连接 * 数限制则创建新连接如原来登记为可用的连接不再有效则从向量删除之 * 然后递归调用自己以尝试新的可用连接 * @return 返回一个数据库连接对象 */ public synchronized Connection getConnection(){ Connection con = null; if (freeConnectionssize() > ) { // 获取向量中第一个可用连接 con = (Connection) freeConnectionsfirstElement(); freeConnectionsremoveElementAt(); try{ if (conisClosed()){ //递归调用自己尝试再次获取可用连接 con = getConnection(); } currentConnectionsadd(con); } catch (SQLException e){ //递归调用自己尝试再次获取可用连接 con = getConnection(); } } else if (maxConn == || currentConnectionssize() < maxConn){ con = newConnection(); } return con; } /** * 关闭数据库连接池 */ public void close(){ for ( int i=; i<freeConnectionssize(); i++ ){ try{ ((Connection)freeConnectionsget(i))close(); } catch( SQLException e ){ //debug to errlog eprintStackTrace(Systemerr); } } for ( int i=; i<currentConnectionssize(); i++ ){ try{ ((Connection)currentConnectionsget(i))close(); } catch( SQLException e ){ //debug to errlog eprintStackTrace(Systemerr); } } } /** * 创建新的连接 */ private synchronized Connection newConnection(){ OADS_logtoFileLn("DBPool create new!!!"); //showDetail(); Connection con = null; try{ if (user == null){ con = DriverManagergetConnection(URL); } else{ con = DriverManagergetConnection(URL user password); } currentConnectionsadd(con); } catch (SQLException e){ return null; } return con; } /** * 显示数据库连接池的状态信息 */ public void showDetail(){ OADS_logtoFileLn("current DB connections : " + currentConnectionssize()); OADS_logtoFileLn("free DB connections : " + freeConnectionssize()); } } } |