Вы, вероятно, столкнетесь с рядом ограничений, пытаясь сделать это в одном HTTP-запросе.
Потоковая и асинхронная обработка - два возможных решения.
Потоковая
Похоже, В JPA 2.2 добавлена поддержка потоковой передачи .Чтобы избежать нехватки памяти, вам, вероятно, потребуется настроить JVM, вам также, вероятно, потребуется настроить размер выборки JDBC, чтобы сбалансировать производительность вашей БД и производительность вашего клиента.
Затем вы можете выполнять потоковую / буферную передачу.результаты возвращаются клиенту.
Однако при таком подходе есть проблемы.Что происходит при кратковременной потере сетевого соединения?Кто-то случайно закрыл свой браузер, предоставив заголовки ответа Content-Length для определения оставшегося времени и т. Д.?Лучший подход:
Асинхронный
Шаги могут выглядеть примерно так:
- Клиент отправляет запрос на сервер.
- Сервер запускает асинхронный процесс (веб-работник или JMS).
- Асинхронный процесс создает файл и временно сохраняет его в файловой системе.
- Когда процесс завершается, он отправляет электронное письмоклиенту забрать свой файл.Это называется проверкой претензий.Вместо электронного письма это также может быть возвращенный URL-адрес, который пользователь затем может обновить, чтобы увидеть, когда его файл будет готов к загрузке.
- По истечении «разумного» промежутка времени, когда файл будет удален.
Этот подход может быть настроен для обеспечения возможности автоматического возобновления и устранения неопределенности в сети, и вкладка браузера закрывается из уравнения.В целом, это также облегчает необходимость обработки повторных запросов.Использование JMS также дает возможность масштабировать это решение по горизонтали, а не по вертикали.