Il n'y a pas de «bon» quoi faire, ce n'est pas ce que JPA ou JDO ou tout autre ORM est censé faire, JDBC direct sera votre meilleure alternative, car vous pouvez le configurer pour ramener un petit nombre de lignes à un temps et les vider au fur et à mesure qu'ils sont utilisés, c'est pourquoi les curseurs côté serveur existent.
Les outils ORM ne sont pas conçus pour le traitement en masse, ils sont conçus pour vous permettre de manipuler des objets et d'essayer de rendre le SGBDR dans lequel les données sont stockées aussi transparent que possible, la plupart échouent au niveau de la partie transparente au moins dans une certaine mesure. À cette échelle, il n'y a aucun moyen de traiter des centaines de milliers de lignes (objets), encore moins des millions avec n'importe quel ORM et de l'exécuter dans un laps de temps raisonnable en raison de la surcharge d'instanciation d'objet, pure et simple.
Utilisez l'outil approprié. Les procédures simples JDBC et stockées ont définitivement leur place en 2011, en particulier pour ce qu'elles font mieux par rapport à ces frameworks ORM.
Tirer un million de tout, même dans un simple, List<Integer>
ne sera pas très efficace quelle que soit la façon dont vous le faites. La bonne façon de faire ce que vous demandez est un simple SELECT id FROM table
, réglé sur SERVER SIDE
(dépend du fournisseur) et le curseur FORWARD_ONLY READ-ONLY
et itérer dessus.
Si vous tirez vraiment des millions d'identifiants à traiter en appelant un serveur Web avec chacun d'eux, vous devrez également effectuer un traitement simultané pour que cela s'exécute dans un laps de temps raisonnable. Tirer avec un curseur JDBC et en placer quelques-uns à la fois dans un ConcurrentLinkedQueue et avoir un petit pool de threads (# CPU / Cores + 1) les extraire et les traiter est le seul moyen de terminer votre tâche sur une machine avec tout " "normal" de RAM, étant donné que vous manquez déjà de mémoire.
Voyez également cette réponse .