code: public void close() throws SQLException {
      lock.lock();
      try {
        closed = true;
        if (results != null) {
          if (results.getFetchSize() != 0) {
            skipMoreResults();
          }
  
          results.close();
        }
        protocol = null;
  
        if (connection == null || connection.pooledConnection == null
            || connection.pooledConnection.noStmtEventListeners()) {
          return;
        }
        connection.pooledConnection.fireStatementClosed(this);
      } finally {
        lock.unlock();
      }
    }
docs: Releases this <code>Statement</code> object's database and JDBC resources immediately instead
  of waiting for this to happen when it is automatically closed. It is generally good practice to
  release resources as soon as you are finished with them to avoid tying up database resources.
  Calling the method <code>close</code> on a <code>Statement</code> object that is already closed
  has no effect. <B>Note:</B>When a
  <code>Statement</code> object is closed, its current <code>ResultSet</code> object, if one
  exists, is also closed.
  
  @throws SQLException if a database access error occurs