Нужно ли их закрывать после каждого запроса и инициализировать в начале каждого запроса?
Как часто соединение, выражение и ResultSet закрываются в JDBC?
Ответ 1
Всегда. Вам необходимо приобрести и закрыть их в кратчайшие сроки, чтобы избежать утечки ресурсов, проблем с транзакциями и исчерпанных пулов соединений. Это не приведет к тому, что у БД рано или поздно закончится ресурс, что приведет к исключениям типа "Слишком много соединений".
Нормальная идиома JDBC заключается в следующем: все ресурсы открыты и закрыты в том же try-with-resources:
public List<Entity> list() throws SQLException {
    List<Entity> entities = new ArrayList<Entity>();
    try (
        Connection connection = database.getConnection();
        PreparedStatement statement = connection.prepareStatement(SQL_LIST);
        ResultSet resultSet = statement.executeQuery();
    ) {
        while (resultSet.next()) {
            entities.add(map(resultSet));
        }
    }
    return entities;
}
Или, если вы еще не на Java 7:
public List<Entity> list() throws SQLException {
    List<Entity> entities = new ArrayList<Entity>();
    Connection connection = null;
    PreparedStatement statement = null;
    ResultSet resultSet = null;
    try {
        connection = database.getConnection();
        statement = connection.prepareStatement(SQL_LIST);
        resultSet = statement.executeQuery();
        while (resultSet.next()) {
            entities.add(map(resultSet));
        }
    } finally {
        if (resultSet != null) try { resultSet.close(); } catch (SQLException logOrIgnore) {}
        if (statement != null) try { statement.close(); } catch (SQLException logOrIgnore) {}
        if (connection != null) try { connection.close(); } catch (SQLException logOrIgnore) {}
    }
    return entities;
}
Использование PreparedStatement даст вам преимущество кэширования БД операторов (рядом с предотвращением внедрения SQL при правильном использовании). Приобретение и закрытие соединения - самая дорогая задача, но для этого созданы пулы соединений. Если вы хотите повторно использовать один и тот же оператор для массовых вставок/обновлений, вы можете использовать партии.
См. также:
Ответ 2
Поскольку вам не нужны результаты предыдущего запроса, вам необходимо инициализировать ResultSet, конечно.
Оператор может быть сохранен, если необходимо снова, и особенно PreparedStatements должен быть сохранен - их можно предварительно скомпилировать при первом запуске базы данных, что экономит несколько секунд:
"SELECT foo FROM bar WHERE a = ?" 
если, конечно, изменяется только параметр.
