Разработка DAO, которая читает огромное количество данных - PullRequest
0 голосов
/ 18 мая 2018

Это может быть небольшой открытый (и субъективный) вопрос, но, пожалуйста, потерпите меня.

У меня есть DAO, которая потенциально может загружать огромное количество данных - это может привести к исключениям OutOfMemoryException. Все сущности являются взаимоисключающими и могут обрабатываться одновременно - по сути, вызывающей стороне не нужно сразу получать набор данных.

Я ищу способ вернуть порции данных вызывающей стороне (чтобы DAO не удерживал много данных в памяти).

До сих пор я придумал два возможных решения:

  1. Вызывающая сторона предоставляет потребителю (реализацию функционального интерфейса), который DAO вызывает, когда много данных было прочитано (превышен пороговый предел). DAO передает данные этому получателю (вызываемому в отдельном потоке), очищает свою собственную копию данных и продолжает извлекать остальные данные.

  2. Вызывающая сторона и DAO совместно используют BlockingQueue. DAO помещает каждый извлеченный объект в очередь. Вызывающая сторона периодически опрашивает эти данные из очереди - мне не ясно, как это правильно реализовать. Например, когда прекратить опрашивать очередь и т. Д. (Но не блокирует дорогу).

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

UPDATE:

Я не склонен использовать нумерацию страниц. Каждая найденная сущность довольно тяжелая, и мне бы очень хотелось не сортировать ее.

...