/**
  * This will be called if the Connection returned by the getConnection method came from a
  * PooledConnection, and the user calls the close() method of this connection object. What we need
  * to do here is to release this PooledConnection from our pool...
  */
 @Override
 public void connectionClosed(ConnectionEvent event) {
   PooledConnection pc = (PooledConnection) event.getSource();
   // if this event occurred because we were validating, or if this
   // connection has been marked for removal, ignore it
   // otherwise return the connection to the pool.
   if (!validatingSet.contains(pc)) {
     PooledConnectionAndInfo pci = pcMap.get(pc);
     if (pci == null) {
       throw new IllegalStateException(NO_KEY_MESSAGE);
     }
     try {
       _pool.returnObject(pci.getUserPassKey(), pci);
     } catch (Exception e) {
       System.err.println("CLOSING DOWN CONNECTION AS IT COULD " + "NOT BE RETURNED TO THE POOL");
       pc.removeConnectionEventListener(this);
       try {
         _pool.invalidateObject(pci.getUserPassKey(), pci);
       } catch (Exception e3) {
         System.err.println("EXCEPTION WHILE DESTROYING OBJECT " + pci);
         e3.printStackTrace();
       }
     }
   }
 }
 /** Closes the PooledConnection and stops listening for events from it. */
 @Override
 public void destroyObject(UserPassKey key, PooledObject<PooledConnectionAndInfo> p)
     throws Exception {
   PooledConnection pc = p.getObject().getPooledConnection();
   pc.removeConnectionEventListener(this);
   pcMap.remove(pc);
   pc.close();
 }
 private synchronized void disposeConnection(PooledConnection pconn) {
   pconn.removeConnectionEventListener(poolConnectionEventListener);
   if (!recycledConnections.remove(pconn) && pconn != connectionInTransition) {
     // If the PooledConnection is not in the recycledConnections list
     // and is not currently within a PooledConnection.getConnection() call,
     // we assume that the connection was active.
     if (activeConnections <= 0) {
       throw new AssertionError();
     }
     activeConnections--;
     semaphore.release();
   }
   closeConnectionAndIgnoreException(pconn);
   assertInnerState();
 }
  /**
   * If a fatal error occurs, close the underlying physical connection so as not to be returned in
   * the future
   */
  @Override
  public void connectionErrorOccurred(ConnectionEvent event) {
    PooledConnection pc = (PooledConnection) event.getSource();
    if (null != event.getSQLException()) {
      System.err.println(
          "CLOSING DOWN CONNECTION DUE TO INTERNAL ERROR (" + event.getSQLException() + ")");
    }
    pc.removeConnectionEventListener(this);

    PooledConnectionAndInfo info = pcMap.get(pc);
    if (info == null) {
      throw new IllegalStateException(NO_KEY_MESSAGE);
    }
    try {
      _pool.invalidateObject(info.getUserPassKey(), info);
    } catch (Exception e) {
      System.err.println("EXCEPTION WHILE DESTROYING OBJECT " + info);
      e.printStackTrace();
    }
  }
 /**
  * Cleans up pooled connections from cleanupMap. 1) remove PoolableConnectionAndInfo wrapper from
  * pcMap 2) remove from MuteMap
  */
 private void cleanupListeners() {
   try {
     Iterator iter = cleanupMap.keySet().iterator();
     while (iter.hasNext()) {
       PooledConnection pc = (PooledConnection) iter.next();
       pcMap.remove(pc);
       muteMap.remove(pc);
       try {
         pc.removeConnectionEventListener(this);
       } catch (Exception ex) {
         System.err.println("EXCEPTION REMOVING CONNECTION LISTENER ");
         ex.printStackTrace();
       }
     }
   } catch (Exception e) {
     System.err.println("EXCEPTION CLEANING UP CONNECTION LISTENERS ");
     e.printStackTrace();
   } finally {
     cleanupMap.clear();
   }
 }
 @Override
 public void removeConnectionEventListener(ConnectionEventListener eventTarget) {
   passthru.removeConnectionEventListener(eventTarget);
 }