Verwenden Sie die ScrollableResults von Hibernate, um 90 Millionen Datensätze langsam zu lesen

Ich muss einfach jede Zeile in einer Tabelle in meiner MySQL-Datenbank mit Hibernate lesen und eine darauf basierende Datei schreiben. Aber es gibt 90 Millionen Zeilen und sie sind ziemlich groß. So schien es, als wäre folgendes angebracht:

ScrollableResults results = session.createQuery("SELECT person FROM Person person")
            .setReadOnly(true).setCacheable(false).scroll(ScrollMode.FORWARD_ONLY);
while (results.next())
    storeInFile(results.get()[0]);

Das Problem ist, dass das obige Programm versucht, alle 90 Millionen Zeilen in den RAM zu laden, bevor es in die while-Schleife wechselt. Dadurch wird mein Speicher mit den Ausnahmen von OutOfMemoryError: Java-Heapspeicherplatz zerstört: (.

Also, ich denke, ScrollableResults ist nicht das, wonach ich gesucht habe? Was ist der richtige Weg, um damit umzugehen? Es macht mir nichts aus, wenn diese while-Schleife Tage dauer

Ich denke, die einzige andere Möglichkeit, dies zu handhaben, besteht darin, setFirstResult und setMaxResults zu verwenden, um die Ergebnisse zu durchlaufen und statt ScrollableResults nur reguläre Ruhezustandsergebnisse zu verwenden. Das fühlt sich jedoch ineffizient an und wird unglaublich lange dauern, wenn ich setFirstResult in der 89-millionsten Zeile aufrufe ...

UPDATE: setFirstResult / setMaxResults funktioniert nicht, es dauert ungewöhnlich lange, bis die Offsets erreicht sind, wie ich befürchtet habe. Hier muss es eine Lösung geben! Ist das nicht ein ziemlich normales Verfahren? Ich bin bereit, auf den Ruhezustand zu verzichten und JDBC oder was auch immer zu verwenden.

UPDATE 2: Die Lösung, die ich gefunden habe und die in Ordnung ist, ist nicht großartig. Sie hat im Grunde die Form:

select * from person where id > <offset> and <other_conditions> limit 1

Da ich andere Bedingungen habe, sogar alle in einem Index, ist es immer noch nicht so schnell, wie ich es gerne hätte ... also immer noch offen für andere Vorschläge ..

Antworten auf die Frage(24)

Ihre Antwort auf die Frage