/**
  * If pooling of <code>PreparedStatement</code>s is turned on in the {@link DriverAdapterCPDS}, a
  * pooled object may be returned, otherwise delegate to the wrapped jdbc 1.x {@link
  * java.sql.Connection}.
  *
  * @exception SQLException if this connection is closed or an error occurs in the wrapped
  *     connection.
  */
 public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency)
     throws SQLException {
   assertOpen();
   return pooledConnection.prepareStatement(sql, resultSetType, resultSetConcurrency);
 }
 /**
  * Marks the Connection as closed, and notifies the pool that the pooled connection is available.
  * In accordance with the jdbc specification this Connection cannot be used after closed() is
  * called. Any further usage will result in an SQLException.
  *
  * @exception SQLException The database connection couldn't be closed.
  */
 public void close() throws SQLException {
   isClosed = true;
   pooledConnection.notifyListeners();
 }
 /**
  * If pooling of <code>PreparedStatement</code>s is turned on in the {@link DriverAdapterCPDS}, a
  * pooled object may be returned, otherwise delegate to the wrapped jdbc 1.x {@link
  * java.sql.Connection}.
  *
  * @exception SQLException if this connection is closed or an error occurs in the wrapped
  *     connection.
  */
 public PreparedStatement prepareStatement(String sql) throws SQLException {
   assertOpen();
   return pooledConnection.prepareStatement(sql);
 }
 /**
  * Attempt to establish a database connection.
  *
  * @param username name to be used for the connection
  * @param pass password to be used fur the connection
  */
 public PooledConnection getPooledConnection(String username, String pass) throws SQLException {
   getConnectionCalled = true;
   /*
   public GenericKeyedObjectPool(KeyedPoolableObjectFactory factory,
   int maxActive, byte whenExhaustedAction, long maxWait,
   int maxIdle, boolean testOnBorrow, boolean testOnReturn,
   long timeBetweenEvictionRunsMillis,
   int numTestsPerEvictionRun, long minEvictableIdleTimeMillis,
   boolean testWhileIdle) {
   */
   KeyedObjectPool stmtPool = null;
   if (isPoolPreparedStatements()) {
     if (getMaxPreparedStatements() <= 0) {
       // since there is no limit, create a prepared statement pool with an eviction thread
       //  evictor settings are the same as the connection pool settings.
       stmtPool =
           new GenericKeyedObjectPool(
               null,
               getMaxActive(),
               GenericKeyedObjectPool.WHEN_EXHAUSTED_GROW,
               0,
               getMaxIdle(),
               false,
               false,
               getTimeBetweenEvictionRunsMillis(),
               getNumTestsPerEvictionRun(),
               getMinEvictableIdleTimeMillis(),
               false);
     } else {
       // since there is limit, create a prepared statement pool without an eviction thread
       //  pool has LRU functionality so when the limit is reached, 15% of the pool is cleared.
       // see org.apache.commons.pool.impl.GenericKeyedObjectPool.clearOldest method
       stmtPool =
           new GenericKeyedObjectPool(
               null,
               getMaxActive(),
               GenericKeyedObjectPool.WHEN_EXHAUSTED_GROW,
               0,
               getMaxIdle(),
               getMaxPreparedStatements(),
               false,
               false,
               -1,
               0,
               0, // -1 tells the pool that there should be no eviction thread.
               false);
     }
   }
   // Workaround for buggy WebLogic 5.1 classloader - ignore the
   // exception upon first invocation.
   try {
     PooledConnectionImpl pci = null;
     if (connectionProperties != null) {
       connectionProperties.put("user", username);
       connectionProperties.put("password", pass);
       pci =
           new PooledConnectionImpl(
               DriverManager.getConnection(getUrl(), connectionProperties), stmtPool);
     } else {
       pci =
           new PooledConnectionImpl(
               DriverManager.getConnection(getUrl(), username, pass), stmtPool);
     }
     pci.setAccessToUnderlyingConnectionAllowed(isAccessToUnderlyingConnectionAllowed());
     return pci;
   } catch (ClassCircularityError e) {
     PooledConnectionImpl pci = null;
     if (connectionProperties != null) {
       pci =
           new PooledConnectionImpl(
               DriverManager.getConnection(getUrl(), connectionProperties), stmtPool);
     } else {
       pci =
           new PooledConnectionImpl(
               DriverManager.getConnection(getUrl(), username, pass), stmtPool);
     }
     pci.setAccessToUnderlyingConnectionAllowed(isAccessToUnderlyingConnectionAllowed());
     return pci;
   }
 }