No hay "correcto" qué hacer esto, esto no es lo que JPA o JDO o cualquier otro ORM está destinado a hacer, JDBC directo será su mejor alternativa, ya que puede configurarlo para recuperar una pequeña cantidad de filas en un tiempo y vaciarlos a medida que se utilizan, es por eso que existen cursores del lado del servidor.
Las herramientas ORM no están diseñadas para procesamiento masivo, están diseñadas para permitirle manipular objetos e intentar hacer que el RDBMS en el que se almacenan los datos sea lo más transparente posible, la mayoría falla en la parte transparente al menos hasta cierto punto. A esta escala, no hay forma de procesar cientos de miles de filas (Objetos), mucho menos millones con cualquier ORM y hacer que se ejecute en un tiempo razonable debido a la sobrecarga de creación de instancias de objetos, simple y llanamente.
Utilice la herramienta adecuada. El JDBC directo y los procedimientos almacenados definitivamente tienen un lugar en 2011, especialmente en lo que son mejores en hacer frente a estos marcos ORM.
Extraer un millón de cualquier cosa, incluso en un simple, List<Integer>
no será muy eficiente, independientemente de cómo lo hagas. La forma correcta de hacer lo que está pidiendo es simple SELECT id FROM table
, establecido en SERVER SIDE
(dependiente del proveedor) y el cursor enFORWARD_ONLY READ-ONLY
y iterar sobre eso.
Si realmente está extrayendo millones de identificaciones para procesar llamando a algún servidor web con cada una, también tendrá que realizar un procesamiento simultáneo para que esto se ejecute en un período de tiempo razonable. Tirando con un cursor JDBC y colocando algunos de ellos a la vez en una ConcurrentLinkedQueue y tener un pequeño grupo de subprocesos (# CPU / Cores + 1) extraerlos y procesarlos es la única forma de completar su tarea en una máquina con cualquier " "cantidad normal" de RAM, dado que ya se está quedando sin memoria.
Vea esta respuesta también.