Я работаю над созданием API REST, в котором большой объем данных из базы данных Oracle можно отправлять порциями через потоковую передачу в клиентское приложение (например, загрузку файла или прямой поток).
I я получаю поток из JpaRepository, как указано ниже -
@Query("select u from UsersEntity u")
Stream<UsersEntity> findAllByCustomQueryAndStream();
Но теперь возникает проблема, записать этот поток в StreamingResponseBody Выходной поток
Я пытался многими способами, но безуспешно -
Первый подход -
Stream<UsersEntity> usersResultStream = usersRepository.findAllByCustomQueryAndStream();
StreamingResponseBody stream = outputStream -> {
Iterator<UsersEntity> iterator = usersResultStream.iterator();
try (ObjectOutputStream oos = new ObjectOutputStream(outputStream)) {
while (iterator.hasNext()) {
oos.write(iterator.next().toString().getBytes());
}
}
};
Ошибка -
java.sql.SQLException: Closed Resultset: next
at oracle.jdbc.driver.InsensitiveScrollableResultSet.next(InsensitiveScrollableResultSet.java:565) ~[ojdbc7-12.1.0.2.jar:12.1.0.2.0]
Второй подход -
StreamingResponseBody stream = new StreamingResponseBody() {
@Transactional(readOnly = true)
@Override
public void writeTo(OutputStream outputStream) throws IOException {
Stream<UsersEntity> usersResultStream = usersRepository.findAllByCustomQueryAndStream();
try (ObjectOutputStream oos = new ObjectOutputStream(outputStream)) {
usersResultStream.forEach(user->{
try {
oos.write(user.toString().getBytes());
} catch (IOException e) {
e.printStackTrace();
}
});
}
}
};
Получена ошибка -
org.springframework.dao.InvalidDataAccessApiUsageException: You're trying to execute a streaming query method without a surrounding transaction that keeps the connection open so that the Stream can actually be consumed. Make sure the code consuming the stream uses @Transactional or any other way of declaring a (read-only) transaction.
Я загрузил тренировочный код по приведенной ниже ссылке - Образец заказа на поставку C Ссылка
У меня нет опыта выполнения задачи, связанной с потоковой передачей, поэтому, пожалуйста, помогите мне с этим.
Если я не в том направлении, чем предлагать какой-либо другой подход для этого в Spring Framework . Пожалуйста, поделитесь ссылками, если таковые имеются.