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