the detail pool management code DBConnectionManager.java package com.coa.cim.database; /** * Title: CIM SYSTEM * Description: The Customer Infomation Managment System * Copyright: Copyright (c) 2002 * Company: COA Sci&Tech * @author Mula Liu * @version 1.0 */ import java.sql.*; import java.util.*; import java.io.*; public class DBConnectionManager { private static DBConnectionManager instance=null; private DBConnectionPool pool; private static int client; private Properties dbProps; private Vector drivers; public DBConnectionManager() { init(); } public synchronized static DBConnectionManager getInstance(){ if(instance==null){ instance=new DBConnectionManager(); } client++; return(instance); } //create an instance of connection manager. if exits ,just returen the instance void init(){ drivers=new Vector(); InputStream is=this.getClass().getResourceAsStream("../resource/Res.properties"); try{ dbProps=new Properties(); dbProps.load(is); }catch(Exception ex){ System.out.println("Miss Resource File "+ex.getMessage()); } loadDriver(); createPool(); } //using Properties.load() method to locate outter properties file public void loadDriver(){ String driverClasses=dbProps.getProperty("dbDriver"); StringTokenizer st =new StringTokenizer(driverClasses); while(st.hasMoreElements()){ String driverClassName=st.nextToken().trim(); try{ Driver driver=(Driver)Class.forName(driverClassName).newInstance(); DriverManager.registerDriver(driver); drivers.addElement(driver); }catch(Exception ex){ ex.printStackTrace(); } } } //parse the file, load mutil driver class in public void createPool(){ String userName=dbProps.getProperty("dbUserName"); String password=dbProps.getProperty("dbPassword"); String url=dbProps.getProperty("connectionURL"); int maxConn; try{ maxConn=Integer.valueOf(dbProps.getProperty("maxConnection","0")).intValue(); }catch(NumberFormatException ex){ maxConn=0; } pool=new DBConnectionPool(userName,password,url,maxConn); } //parse the file, load username,password,url and maxconnection in public synchronized int getClientCount(){ return(client); } public Connection getDBConnection(){ if(pool != null){ return(pool.getDBConnection()); } return(null); }//act as facade public Connection getDBConnection(long timeout){ if(pool != null){ return(pool.getDBConnection(timeout)); } return(null); }//act as facade public void freeDBConnection(Connection conn){ if(pool != null){ pool.freeDBConnection(conn); } }//act as facade public void realse(){ if(this.client != 0){ return; } if(pool != null){ pool.release(); Enumeration enum=drivers.elements(); while(enum.hasMoreElements()){ Driver driver=(Driver)enum.nextElement(); try{ DriverManager.deregisterDriver(driver); }catch(Exception ex){ System.out.println("Can not deregister driver "+driver.getClass().getName()); } } } }//act as facade then de register driver } ________________________________________ DBConnectionPool.java package com.coa.cim.database; /** * Title: CIM SYSTEM * Description: The Customer Infomation Managment System * Copyright: Copyright (c) 2002 * Company: COA Sci&Tech * @author Mula Liu * @version 1.0 */ import java.sql.*; import java.util.*; public class DBConnectionPool { private String dbUserName; private String dbPassword; private String connectionURL; private int maxConnection; private Vector freeConnections; private int checkedOut; public DBConnectionPool(String userName,String password,String url,int maxConn) { this.dbUserName=userName; this.dbPassword=password; this.connectionURL=url; this.maxConnection=maxConn; freeConnections=new Vector(); }// initalize public synchronized Connection getDBConnection(){ Connection conn=null; if(freeConnections.size() > 0){ conn=(Connection)freeConnections.elementAt(0); freeConnections.removeElementAt(0); try{ if(conn.isClosed()){ conn=getDBConnection(); } }catch(SQLException ex){ conn=getDBConnection(); } }else if(maxConnection==0 || checkedOut < maxConnection){ conn=newDBConnection(); } if(conn!=null){ checkedOut++; } return(conn); }// using FIFO method to get connection instance public synchronized Connection getDBConnection(long timeout){ long startTime=new java.util.Date().getTime(); Connection conn; while((conn=getDBConnection())==null){ try{ wait(timeout); }catch(InterruptedException ex){} if(new java.util.Date().getTime()-startTime >= timeout){ return(null); } } return conn; } public Connection newDBConnection(){ Connection conn=null; try{ if(dbUserName==null){ conn=DriverManager.getConnection(connectionURL); }else{ conn=DriverManager.getConnection(connectionURL,dbUserName,dbPassword); } }catch(SQLException ex){ ex.printStackTrace(); } return(conn); } public synchronized void freeDBConnection(Connection conn){ freeConnections.addElement(conn); checkedOut--; notifyAll(); } public synchronized void release(){ Enumeration allConnections=freeConnections.elements(); while(allConnections.hasMoreElements()){ try{ Connection conn=(Connection)allConnections.nextElement(); conn.close(); }catch(SQLException ex){ ex.printStackTrace(); } } freeConnections.removeAllElements(); } } |