Non esiste un "corretto" cosa fare, questo non è ciò che JPA o JDO o qualsiasi altro ORM è inteso fare, JDBC diretto sarà la tua migliore alternativa, poiché puoi configurarlo per ripristinare un piccolo numero di righe in una volta e svuotali man mano che vengono utilizzati, ecco perché esistono cursori lato server.
Gli strumenti ORM non sono progettati per l'elaborazione in blocco, sono progettati per consentire di manipolare oggetti e tentare di rendere l'RDBMS in cui sono archiviati i dati essere il più trasparente possibile, la maggior parte fallisce nella parte trasparente almeno in una certa misura. A questa scala, non è possibile elaborare centinaia di migliaia di righe (oggetti), tanto meno milioni con qualsiasi ORM e farlo eseguire in un ragionevole lasso di tempo a causa dell'overhead di istanziazione dell'oggetto, chiaro e semplice.
Usa lo strumento appropriato. Il JDBC diretto e le procedure memorizzate hanno sicuramente un posto nel 2011, specialmente in ciò che sono migliori nel fare rispetto a questi framework ORM.
Tirare un milione di qualsiasi cosa, anche in un semplice List<Integer>
non sarà molto efficiente indipendentemente da come lo fai. Il modo corretto per fare ciò che stai chiedendo è un semplice SELECT id FROM table
, impostare su SERVER SIDE
(dipendente dal fornitore) e il cursore su FORWARD_ONLY READ-ONLY
e iterare su quello.
Se stai davvero tirando milioni di ID da elaborare chiamando un server Web con ciascuno di essi, dovrai eseguire anche un'elaborazione simultanea affinché funzioni in un ragionevole lasso di tempo. Tirare con un cursore JDBC e posizionarne alcuni alla volta in un ConcurrentLinkedQueue e avere un piccolo pool di thread (# CPU / Core + 1) estrarli ed elaborarli è l'unico modo per completare l'attività su una macchina con qualsiasi " normale "quantità di RAM, dato che stai già esaurendo la memoria.
Vedi anche questa risposta .