Es gibt kein "richtiges" Vorgehen, dies ist nicht das, was JPA oder JDO oder ein anderes ORM tun sollen. Gerade JDBC ist Ihre beste Alternative, da Sie es so konfigurieren können, dass eine kleine Anzahl von Zeilen zurückgebracht wird eine Zeit und leeren Sie sie, wie sie verwendet werden, deshalb gibt es serverseitige Cursor.
ORM-Tools sind nicht für die Massenverarbeitung konzipiert. Sie dienen dazu, Objekte zu manipulieren und zu versuchen, das RDBMS, in dem die Daten gespeichert sind, so transparent wie möglich zu gestalten. Die meisten Fehler treten zumindest teilweise im transparenten Bereich auf. In dieser Größenordnung gibt es keine Möglichkeit, Hunderttausende von Zeilen (Objekten), geschweige denn Millionen, mit einem ORM zu verarbeiten und es in angemessener Zeit ausführen zu lassen, da der Aufwand für die Objektinstanziierung schlicht und einfach ist.
Verwenden Sie das entsprechende Werkzeug. Straight JDBC und Stored Procedures haben 2011 definitiv einen Platz, insbesondere was sie im Vergleich zu diesen ORM-Frameworks besser können.
Eine Million von irgendetwas zu ziehen, selbst in eine einfache, List<Integer>
wird nicht sehr effizient sein, unabhängig davon, wie Sie es tun. Der richtige Weg, um das zu tun, was Sie verlangen, ist einfach SELECT id FROM table
, auf SERVER SIDE
(herstellerabhängig) gesetzt und der Cursor darauf FORWARD_ONLY READ-ONLY
und iteriert darüber.
Wenn Sie wirklich Millionen von IDs zur Verarbeitung ziehen, indem Sie jeweils einen Webserver aufrufen, müssen Sie auch eine gleichzeitige Verarbeitung durchführen, damit diese in einer angemessenen Zeit ausgeführt werden kann. Das Ziehen mit einem JDBC-Cursor und das gleichzeitige Platzieren einiger davon in einer ConcurrentLinkedQueue sowie das Ziehen und Verarbeiten eines kleinen Pools von Threads (# CPU / Cores + 1) ist die einzige Möglichkeit, Ihre Aufgabe auf einem Computer mit einem beliebigen " normale "RAM-Größe, vorausgesetzt, Sie haben bereits nicht genügend Speicher.
Siehe diese Antwort .