Раннее закрытие соединения перед использованием Stream

Если Stream лениво читает JDBC-результат, соединение закрывается слишком рано: обход начнётся уже после close(). Владение ресурсами должно охватывать всю терминальную операцию.

Короткий ответ

Что ответить на собеседовании

Если Stream лениво читает JDBC-результат, соединение закрывается слишком рано: обход начнётся уже после close(). Владение ресурсами должно охватывать всю терминальную операцию.

Подробный разбор

Ответ с пояснениями

Условие

Проведите ревью следующего кода, обращая внимание на порядок закрытия ресурсов.

public Stream<User> getUserStream() {
    Connection connection = DataSourceObject.getConnection();
    Stream<User> stream = executeAndReturnStream(connection);
    connection.close();
    return stream;
}

public void processUsers() {
    Stream<User> users = getUserStream();
    users.forEach(user -> System.out.println(user.getName()));
}

Ответ

Если Stream лениво читает JDBC-результат, соединение закрывается слишком рано: обход начнётся уже после close(). Владение ресурсами должно охватывать всю терминальную операцию.

Проще выполнять чтение и обработку внутри одного блока:

try (Connection connection = DataSourceObject.getConnection();
     Stream<User> users = executeAndReturnStream(connection)) {
    users.forEach(user -> System.out.println(user.getName()));
}

Код размещается в методе с обработкой/объявлением SQLException. Реализация executeAndReturnStream должна закрывать также ResultSet и Statement при закрытии stream и при ошибке создания. Если API возвращает Stream наружу, нужен onClose с очисткой и обязательный try-with-resources у вызывающего кода; простая терминальная операция stream сама не закрывает.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее