ConnectionPool.java:
public interface ConnectionPool{ Connection getConnection() throws test.res.ResourceNotAvailableException, SQLException; Connection getConnection(long timeout) throws test.res.ResourceTimeOutException, SQLException; void clear(); }
ConnectionHome.java:
public interface ConnectionHome{ void releaseConnection(Connection conn); }
ConnectionPooling.java:
public interface ConnectionPooling extends ConnectionHome{ Connection getConnection() throws test.res.ResourceNotAvailableException, SQLException; Connection getConnection(long timeout) throws test.res.ResourceTimeOutException, SQLException; void clear(); void releaseConnection(Connection conn); }
ConnectionFactory.java:
public interface ConnectionFactory{ public Connection createConnection()throws SQLException; }
PooledConnection.java: (for Connection in Java 1.1.8)
public final class PooledConnection implements Connection{ private interface ConnectionState{ ConnectionState close(); boolean isClosed(); Connection getOpenConnection() throws SQLException; } private static class ClosedConnection implements ConnectionState{ public final ConnectionState close(){return this;} public final Connection getOpenConnection() throws SQLException{ throw new SQLException("Connection closed"); } public final boolean isClosed(){return true;} private ClosedConnection(){} private static final ConnectionState _instance = new ClosedConnection(); static ConnectionState instance(Connection conn, ConnectionHome home){return _instance;} } private static class OpenConnection implements ConnectionState{ private final ConnectionHome home; private final Connection conn; public final ConnectionState close(){ home.releaseConnection(conn); return ClosedConnection.instance(conn, home); } public final Connection getOpenConnection() {return conn;} public final boolean isClosed(){return false;} OpenConnection(Connection conn, ConnectionHome home){ this.conn = conn; this.home = home; } static ConnectionState instance(Connection conn, ConnectionHome home){ return new OpenConnection(conn, home); } } private ConnectionState state; public static Connection decorate(Connection conn, ConnectionHome home) throws SQLException{ return new PooledConnection(conn, home); } private PooledConnection(Connection conn, ConnectionHome home) throws SQLException{ if(conn.isClosed()){ state = ClosedConnection.instance(conn, home); } else{ state = OpenConnection.instance(conn, home); } } public final boolean isClosed(){ return state.isClosed(); }
public final void close(){ state = state.close(); } protected void finalize(){ close(); } private final Connection getOpenConnection() throws SQLException {return state.getOpenConnection();} /*****then, delegate all the other methods****/ public final Statement createStatement() throws SQLException{ return getOpenConnection().createStatement(); } //.... public final void clearWarnings()throws SQLException{ getOpenConnection().clearWarnings(); } public final void commit()throws SQLException{ getOpenConnection().commit(); }
/* public final Statement createStatement(int resultSetType, int resultSetConcurrency) throws SQLException{ return getOpenConnection().createStatement(resultSetType, resultSetConcurrency); }*/ /* public final Statement createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException{ return getOpenConnection().createStatement(resultSetType, resultSetConcurrency, resultSetHoldability); }*/ public final boolean getAutoCommit()throws SQLException{ return getOpenConnection().getAutoCommit(); } public final String getCatalog()throws SQLException{ return getOpenConnection().getCatalog(); } /* public final int getHoldability()throws SQLException{ return getOpenConnection().getHoldability(); }*/ public final DatabaseMetaData getMetaData()throws SQLException{ return getOpenConnection().getMetaData(); } public final int getTransactionIsolation()throws SQLException{ return getOpenConnection().getTransactionIsolation(); } /* public final Map getTypeMap()throws SQLException{ return getOpenConnection().getTypeMap(); }*/ public final SQLWarning getWarnings()throws SQLException{ return getOpenConnection().getWarnings(); }
public final boolean isReadOnly()throws SQLException{ return getOpenConnection().isReadOnly(); } public final String nativeSQL(String sql)throws SQLException{ return getOpenConnection().nativeSQL(sql); } public final CallableStatement prepareCall(String sql)throws SQLException{ return getOpenConnection().prepareCall(sql); } /* public final CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency) throws SQLException{ return getOpenConnection().prepareCall(sql, resultSetType, resultSetConcurrency); } public final CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException{ return getOpenConnection().prepareCall(sql, resultSetType, resultSetConcurrency, resultSetHoldability); }*/ public final PreparedStatement prepareStatement(String sql) throws SQLException{ return getOpenConnection().prepareStatement(sql); } /* public final PreparedStatement prepareStatement(String sql, int autoGeneratedKeys) throws SQLException{ return getOpenConnection().prepareStatement(sql, autoGeneratedKeys); }
public final PreparedStatement prepareStatement(String sql, int[] columnIndexes) throws SQLException{ return getOpenConnection().prepareStatement(sql, columnIndexes); } public final PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency) throws SQLException{ return getOpenConnection().prepareStatement(sql, resultSetType, resultSetConcurrency); } public final PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException{ return getOpenConnection().prepareStatement(sql, resultSetType, resultSetConcurrency, resultSetHoldability); } public final PreparedStatement prepareStatement(String sql, String[] columnNames) throws SQLException{ return getOpenConnection().prepareStatement(sql, columnNames); } public final void releaseSavepoint(Savepoint savepoint)throws SQLException{ getOpenConnection().releaseSavepoint(savepoint); }*/ public final void rollback()throws SQLException{ getOpenConnection().rollback(); } /* public final void rollback(Savepoint savepoint) throws SQLException{ getOpenConnection().rollback(savepoint); }*/ public final void setAutoCommit(boolean autoCommit) throws SQLException{ getOpenConnection().setAutoCommit(autoCommit); } public final void setCatalog(String catalog) throws SQLException{ getOpenConnection().setCatalog(catalog); } /* public final void setHoldability(int holdability) throws SQLException{ getOpenConnection().setHoldability(holdability); }*/ public final void setReadOnly(boolean readOnly) throws SQLException{ getOpenConnection().setReadOnly(readOnly); } /* public final Savepoint setSavepoint()throws SQLException{ return getOpenConnection().setSavepoint(); } public final Savepoint setSavepoint(String name) throws SQLException{ return getOpenConnection().setSavepoint(name); }*/ public final void setTransactionIsolation(int level) throws SQLException{ getOpenConnection().setTransactionIsolation(level); } /*public final void setTypeMap(Map map)throws SQLException{ getOpenConnection().setTypeMap(map); }*/
/*************************************************************************************************/
}
ConnectionPooling2Pool.java:
public class ConnectionPooling2Pool implements ConnectionPool{ public final Connection getConnection() throws test.res.ResourceNotAvailableException, SQLException{ return PooledConnection.decorate(pooling.getConnection(), pooling); } public final Connection getConnection(long timeout) throws test.res.ResourceTimeOutException, SQLException{ return PooledConnection.decorate(pooling.getConnection(timeout), pooling); } public final void clear(){ pooling.clear(); } private final ConnectionPooling pooling; private ConnectionPooling2Pool(ConnectionPooling pooling){ this.pooling = pooling; } public static ConnectionPool decorate(ConnectionPooling pooling){ return new ConnectionPooling2Pool(pooling); } }
ConnectionPoolingImpl.java: (a simple implementation of ConnectionMan)
public class ConnectionPoolingImpl implements ConnectionPooling { private int client=0; private final Vector freeConn = new Vector(); private final int maxConn; private final ConnectionFactory factory;
static public ConnectionPooling instance(ConnectionFactory factory, int max){ return new ConnectionPoolingImpl(factory, max); } private ConnectionPoolingImpl(ConnectionFactory factory, int max){ this.factory = factory; this.maxConn = max; }
public final synchronized void releaseConnection(Connection conn) { freeConn.addElement(conn); client--; notify(); }
public final synchronized Connection getConnection() throws ResourceNotAvailableException, SQLException { Connection conn = null; if(freeConn.size() > 0) { conn = (Connection)freeConn.lastElement(); freeConn.removeElementAt(freeConn.size()-1); } else if(client < maxConn) { conn = factory.createConnection(); } if(conn != null) { client++; return conn; } else { throw new ResourceNotAvailableException(); } }
public final synchronized Connection getConnection(long timeout) throws ResourceTimeOutException, SQLException { for(long startTime = new java.util.Date().getTime();;) { try { return getConnection(); } catch(ResourceNotAvailableException e1) { try { wait(timeout); } catch(InterruptedException e2) {} if((new java.util.Date().getTime() - startTime) >= timeout) { throw new ResourceTimeOutException(); } } } }
public final synchronized int getfreeconn(){ return freeConn.size(); } public final int getmaxConn(){ return maxConn; } public final synchronized int getclient(){ return client; } public final synchronized void setclient(){ client=0; }
public final synchronized void clear(){ closeAll(); freeConn.removeAllElements(); } private final void closeAll(){ for(int i=0; i<freeConn.size();i++) { final Connection conn = (Connection)freeConn.elementAt(i); try{ conn.close(); } catch(SQLException sqlException){} } } protected void finalize(){ closeAll(); } }
ConnectionFactoryImpl.java:
public class ConnectionFactoryImpl { private ConnectionFactoryImpl(){} static public ConnectionFactory instance(final String driver, final String url, final String user, final String pwd) throws SQLException, ClassNotFoundException{ final Class driverClass = Class.forName(driver); return new ConnectionFactory(){ private final Class keeper = driverClass; public final Connection createConnection() throws SQLException{ return DriverManager.getConnection(url,user,pwd); } }; } static public ConnectionFactory instance(final String driver, final String url) throws SQLException, ClassNotFoundException{ final Class driverClass = Class.forName(driver); return new ConnectionFactory(){ private final Class keeper = driverClass; public final Connection createConnection() throws SQLException{ return DriverManager.getConnection(url); } }; } }
TestConnectionPool.java:
public class TestConnectionPool{ public static void test(String driver, String url, String user, String pwd) throws java.sql.SQLException, test.res.ResourceNotAvailableException, test.res.ResourceTimeOutException, ClassNotFoundException{ final ConnectionPool pool = ConnectionPooling2Pool.decorate( ConnectionPoolingImpl.instance( ConnectionFactoryImpl.instance(driver, url, user, pwd), 1000) ); } }
ResourceNotAvailableException.java:
public class ResourceNotAvailableException extends RuntimeException{ public ResourceNotAvailableException(String msg){super(msg);} public ResourceNotAvailableException(){} }
ResourceTimeOutException.java:
public class ResourceTimeOutException extends Exception{ public ResourceTimeOutException(String msg){super(msg);} public ResourceTimeOutException(){} } 
|