code: @Override
     public final void close() throws SQLException
     {
        // Closing statements can cause connection eviction, so this must run before the conditional below
        closeStatements();
  
        if (delegate != ClosedConnection.CLOSED_CONNECTION) {
           leakTask.cancel();
  
           try {
              if (isCommitStateDirty && !isAutoCommit) {
                 delegate.rollback();
                 lastAccess = currentTime();
                 LOGGER.debug("{} - Executed rollback on connection {} due to dirty commit state on close().", poolEntry.getPoolName(), delegate);
              }
  
              if (dirtyBits != 0) {
                 poolEntry.resetConnectionState(this, dirtyBits);
                 lastAccess = currentTime();
              }
  
              delegate.clearWarnings();
           }
           catch (SQLException e) {
              // when connections are aborted, exceptions are often thrown that should not reach the application
              if (!poolEntry.isMarkedEvicted()) {
                 throw checkException(e);
              }
           }
           finally {
              delegate = ClosedConnection.CLOSED_CONNECTION;
              poolEntry.recycle(lastAccess);
           }
        }
     }
docs: {@inheritDoc}