@Override
  public void passivateObject(PooledObject<PoolableConnection> p) throws Exception {

    validateLifetime(p);

    PoolableConnection conn = p.getObject();
    Boolean connAutoCommit = null;
    if (rollbackOnReturn) {
      connAutoCommit = Boolean.valueOf(conn.getAutoCommit());
      if (!connAutoCommit.booleanValue() && !conn.isReadOnly()) {
        conn.rollback();
      }
    }

    conn.clearWarnings();

    // DBCP-97 / DBCP-399 / DBCP-351 Idle connections in the pool should
    // have autoCommit enabled
    if (enableAutoCommitOnReturn) {
      if (connAutoCommit == null) {
        connAutoCommit = Boolean.valueOf(conn.getAutoCommit());
      }
      if (!connAutoCommit.booleanValue()) {
        conn.setAutoCommit(true);
      }
    }

    conn.passivate();
  }
  @Override
  public void activateObject(PooledObject<PoolableConnection> p) throws Exception {

    validateLifetime(p);

    PoolableConnection conn = p.getObject();
    conn.activate();

    if (_defaultAutoCommit != null && conn.getAutoCommit() != _defaultAutoCommit.booleanValue()) {
      conn.setAutoCommit(_defaultAutoCommit.booleanValue());
    }
    if (_defaultTransactionIsolation != UNKNOWN_TRANSACTIONISOLATION
        && conn.getTransactionIsolation() != _defaultTransactionIsolation) {
      conn.setTransactionIsolation(_defaultTransactionIsolation);
    }
    if (_defaultReadOnly != null && conn.isReadOnly() != _defaultReadOnly.booleanValue()) {
      conn.setReadOnly(_defaultReadOnly.booleanValue());
    }
    if (_defaultCatalog != null && !_defaultCatalog.equals(conn.getCatalog())) {
      conn.setCatalog(_defaultCatalog);
    }
    conn.setDefaultQueryTimeout(defaultQueryTimeout);
  }
 public void validateConnection(PoolableConnection conn) throws SQLException {
   if (conn.isClosed()) {
     throw new SQLException("validateConnection: connection closed");
   }
   conn.validate(_validationQuery, _validationQueryTimeout);
 }