Немає "належного", що робити, це не те, що призначено робити JPA або JDO чи будь-який інший ORM, найкраща альтернатива буде JDBC, оскільки ви можете налаштувати її для повернення невеликої кількості рядків на час і промивайте їх у міру їх використання, тому існують курсори на стороні сервера.
Інструменти ORM не розроблені для масової обробки, вони призначені для маніпулювання об'єктами та спроби зробити RDBMS, в якій зберігаються дані, бути максимально прозорими, більшість не спрацьовує в прозорій частині хоча б певною мірою. У такому масштабі немає способу обробити сотні тисяч рядків (Об'єкти), набагато менше мільйонів за допомогою будь-якої ОРМ та дозволити його виконувати в будь-який розумний проміжок часу із-за простого та простого опису об'єкта.
Скористайтеся відповідним інструментом. Прямі JDBC та зберігаються процедури, безумовно, мають місце в 2011 році, особливо в тому, що їм краще робити в порівнянні з цими рамками ORM.
Витягнути мільйон будь-чого, навіть простого List<Integer>
, не буде дуже ефективно, незалежно від того, як ви це зробите. Правильний спосіб зробити те, що ви запитуєте, - простий SELECT id FROM table
, встановлений на SERVER SIDE
(залежно від постачальника), а курсор - FORWARD_ONLY READ-ONLY
і повторити його.
Якщо ви дійсно затягуєте мільйони ідентифікаторів, щоб обробити, зателефонувавши до якогось веб-сервера, вам доведеться виконати одночасну обробку, щоб це запустилося в будь-яку розумну кількість часу. Перетягування курсором JDBC та розміщення декількох з них одночасно у ConcurrentLinkedQueue та невеликий пул потоків (# CPU / Cores + 1) витягують та обробляють їх - єдиний спосіб виконати завдання на машині з будь-яким " нормальний "об'єм оперативної пам'яті, враховуючи, що у вас вже не вистачає пам'яті.
Дивіться також цю відповідь .