Optimierungsstrategien zum Lesen großer Ergebnismengen mit Hibernate
Dieser Artikel befasst sich mit der Herausforderung, 90 Millionen Datensätze aus einer MySQL-Datenbank mit Hibernate ohne zu lesen RAM wird überlastet.
ScrollableResults Einschränkungen
Zunächst versuchte der Benutzer, die ScrollableResults von Hibernate zu nutzen, um Ergebnisse inkrementell zu streamen. Allerdings bietet die MySQL Connector/J-Bibliothek keine echten Bildlauffunktionen und lädt den gesamten Ergebnissatz in den Speicher, was zu einer OutOfMemoryError-Ausnahme führt.
setFirstResult/setMaxResults vs. ScrollableResults
Um dieses Problem zu umgehen, erwog der Benutzer, setFirstResult und setMaxResults iterativ zu verwenden Holen Sie sich Stapel von Ergebnissen. Dieser Ansatz kann jedoch insbesondere bei großen Ergebnismengen ineffizient sein, da für jeden Batch ein Mehraufwand für die Initialisierung einer neuen Abfrage entsteht.
Optimierter Batch-Abruf mit Native SQL
Die vom Befragten vorgeschlagene optimalste Lösung bestand darin, aus dem MySQL J/Connector auszubrechen und eine Batch-Abfrage zu verwenden:
select * from person where id > <max_id_of_last_batch> and <other_conditions> order by id asc limit <batch_size>
Dies Die Abfrage erfasst einen Stapel von Datensätzen basierend auf einer zuvor ermittelten maximalen ID aus dem vorherigen Stapel und ordnet sie in aufsteigender Reihenfolge nach ID. Der Parameter „batch_size“ bestimmt die Anzahl der Datensätze, die gleichzeitig abgerufen werden sollen. Dieser Ansatz stellt sicher, dass nur eine überschaubare Anzahl von Datensätzen im Speicher verarbeitet wird, wodurch eine Speichererschöpfung vermieden wird.
Das obige ist der detaillierte Inhalt vonWie kann ich mit Hibernate effizient 90 Millionen Datensätze aus MySQL abrufen, ohne dass mir der Speicher ausgeht?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!