Читать большие данные из базы данных с помощью JdbcTemplate и выставлять через API? - PullRequest
0 голосов
/ 18 марта 2020

У меня есть требование для чтения большого набора данных из базы данных postgres, которая должна быть доступна через конечную точку rest api. Клиент, потребляющий данные, должен будет затем преобразовать данные в формат csv (возможно, потребуется поддерживать json и xml позже).

На стороне сервера мы используем Spring Boot v2.1.6. RELEASE и spring-jdb c v5.1.8.RELEASE.
Я попытался использовать подкачку и l oop на всех страницах, сохранить результат в списке и вернуть список, но в результате возникла ошибка OutOfMemory набор данных не помещается в память.

Потоковая передача большого набора данных выглядит как хороший способ справиться с ограничениями памяти. Есть ли способ, которым я могу просто вернуть Stream всех сущностей базы данных, а также сделать оставшиеся API равными клиенту? Как клиент десериализует этот поток?

Есть ли другие альтернативы, кроме этой?

1 Ответ

1 голос
/ 19 марта 2020

Если ваши данные настолько велики, что они не помещаются в память - я думаю, гигабайт или больше - тогда они, вероятно, слишком велики, чтобы разумно предоставлять их в виде одного HTTP-ответа. Вы будете держать соединение открытым в течение очень долгого времени. Если у вас возникнут проблемы на полпути, клиенту нужно будет начать все сначала, возможно, через несколько минут go.

Более удобный API-интерфейс введет разбиение на страницы. Ваш вызывающий может указать размер страницы и индекс страницы для выборки как часть своего запроса

Например

 /my-api/some-collection?size=100&page=50

Это будет означать выборку 100 элементов, начиная с 5000-го (5000 - 5100)

Возможно, вы могли бы наложить разумные ограничения на размер страницы в зависимости от того, что вы можете загрузить в память за один раз.

...