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