Есть ли способ объединить потоковый поиск данных с гибернацией? - PullRequest
2 голосов
/ 11 марта 2010

В целях обработки очень больших коллекций (и под очень большими я просто подразумеваю «с большой вероятностью выбросить исключение OutOfMemory»), использование Hibernate кажется проблематичным, потому что обычно извлечение коллекции выполняется в блоке, т.е. createQuery ("from X"). list (), где вы монолитно собираете все N миллионов значений и затем обрабатываете их.

Что бы я предпочел сделать, это получить значения как итератор, чтобы я мог получить 1000 или около того (или любой другой размер страницы) за раз. Помимо написания моей собственной итерации (которая, похоже, будет заново изобретать колесо), есть ли спящий способ, чтобы справиться с этим?

Ответы [ 2 ]

3 голосов
/ 12 марта 2010

На самом деле session.scroll () может быть лучше, чем итерация в этой ситуации. Iterate запускает один запрос, чтобы получить все идентификаторы, а затем выбирает полные элементы один за другим по мере их обработки. Прокрутка использует базовую функцию прокрутки JDBC, которая извлекает полные объекты, но держит курсор открытым для базы данных. С помощью прокрутки вы можете установить размер партии, чтобы определить наиболее оптимальный номер для возврата за раз. Если загрузка N-миллионов идентификаторов все еще занимает слишком много памяти, прокрутка - это ответ, и я подозреваю, что в любом случае это будет более эффективно.

Никто не собирается автоматически закрывать сеанс.

1 голос
/ 11 марта 2010

Вы могли бы сделать

Iterator iter = session.createQuery("from X").iterate();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...