Bulk-inserts mit Spring / Hibernate
Ich verwende in meiner Anwendung ein mix Spring/Hibernate (nichts original). Für eine gegebene Funktion, ich habe Sie zum importieren der Inhalte einer CSV-Datei in eine Tabelle meiner Oracle-DB.
Für jetzt, ich juste erstellen Sie die Objekte, die ich tun
HibernateTemplate.saveOrUpdate
auf jeden von Ihnen (ich brauche zum abrufen Ihrer neu zugewiesenen Id)
Dann die Transaktion erfolgt am Ende der Methode, mit der Feder transaction API.
Alles funktioniert gut, außer die Leistung, die richtig ist für die rund 5000 Objekte, aber nicht für 100 000...
Also ich Suche für Ideen zu beschleunigen das Zeug. Ich habe gehört, bulk-inserts mit Hibernate, aber konnte nicht finden, eine solide Referenz. Kann jemand mir einige Ideen zur Durchführung dieser import mit mehr Leistung?
- Meine nicht, ein Ruck hier, aber die Dokumentation dazu ist ziemlich prägnant und dauert nur 5 Minuten, um zu Lesen: docs.jboss.org/hibernate/stable/core/reference/en/html/...
- Danke für den link, das ist genau das, was ich suchte. Ich habe einige Forschungen vor und habe es nicht gefunden, aber ich bin ein Neuling bezüglich der Graben in der Hibernate-Dokumentation.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Etwas einfacher, Sie könnten versuchen, ist bündig und klar die session sagen alle 100 Objekte...
so ausführen
alle 100 oder 1000 Einsätze.
Wird bündig und klar die hibernate-session und verhindern, dass es zu groß (möglicherweise, warum Ihre 100 000 Objekte sind so lange).
Außerdem, wenn Sie mit der Identität id generator Ruhezustand lautlos schalten-batch-inserts aus. Batch-inserts wird die Leistung verbessert. Sie würden auch brauchen, um geben Sie den Ruhezustand.jdbc.batch_size Konfiguration Eigenschaft entspricht Ihr 100 zu einem Zeitpunkt, Anzahl.
Manning Java-Persistenz mit Hibernate war die Quelle dieses (tolle Buch - meine Haut gerettet, mehrmals).
Sie sollten auch mit StatelessSession, wie es ist entworfen für bulk-Operationen.
Manchmal ein ORMapper ist nicht der richtige hammer für den Nagel. Vor allem batch-Operationen sind oft mehr performant ausgeführt mit plain old JDBC. Dies hängt natürlich von einer Vielzahl von Bedingungen, aber Sie sollten zumindest sehen dies als eine option und performance-Vergleiche der beiden Ansätze.
Es ist nicht nur eine Reine Datenbank-insert performance-Problem; wenn Sie Zehntausende von Objekten und nicht eine Spülung, die Hibernate-session wird wachsen, bis Sie genügend Arbeitsspeicher zur Verfügung.