In meiner Anwendung muss ich die Leistung des Einsatzes massiv verbessern. Beispiel: Eine Datei mit etwa 21.000 Datensätzen dauert mehr als 100 Minuten zum Einfügen. Es gibt Gründe dafür, dass es einige Zeit dauern kann, etwa 20 Minuten, aber über 100 Minuten sind einfach zu lang.
Daten werden in 3 Tabellen (Viele-zu-Viele) eingefügt. IDs werden aus einer Sequenz generiert, aber ich habe bereits gegooglet und hibernate.id.new_generator_mappings = true
und allocationSize + sequence increment auf 1000 gesetzt.
Auch die Menge an Daten ist nichts außergewöhnliches, die Datei ist 90 mb.
Ich habe mit visual vm verifiziert, dass die meiste Zeit in jdbc-Treiber (postgresql) und Hibernate verbracht wird. Ich denke, das Problem hängt mit einer eindeutigen Einschränkung in der Kindtabelle zusammen. Die Serviceebene führt vor dem Einfügen eine manuelle Überprüfung (= SELECT) durch. Wenn der Datensatz bereits existiert, wird er wiederverwendet, anstatt auf eine bedingte Ausnahme zu warten.
Um es für die spezifische Datei zusammenzufassen, gibt es 1 Einfügung pro Tabelle (könnte anders sein, aber nicht für diese Datei, die der ideale (schnellste) Fall ist). Das bedeutet insgesamt 60k Inserts + 20k selects. Immer noch über 100 min scheint sehr lang (yeah Hardware zählt und es ist auf einem einfachen PC mit 7200 rpm Laufwerk, keine SSD oder Raid). Dies ist jedoch eine verbesserte Version gegenüber einer früheren Anwendung (plain jdbc), bei der das gleiche Insert auf dieser Hardware etwa 15 min dauerte. Wenn man bedenkt, dass in beiden Fällen etwa 4-5 Minuten für die "Vorverarbeitung" aufgewendet werden, ist der Anstieg massiv.
Irgendwelche Tipps, wer das verbessern könnte? Gibt es Batch-Lade-Funktionalität?
siehe
spring-data JPA: manuelle Commit-Transaktion und fange neu an
Fügen Sie entityManager.flush()
und entityManager.clear()
nach jedem n-ten Aufruf der Methode save () hinzu. Wenn Sie Hibernate verwenden, fügen Sie hibernate.jdbc.batch_size hinzu und legen Sie it = n fest. 100 scheint eine vernünftige Wahl zu sein.
Leistungssteigerung war & gt; 10x, wahrscheinlich fast 100x.
klingt wie ein Datenbankproblem. überprüfen Sie Ihre Tabellen, wenn teyh innodb oder myisam verwenden, ist die spätere in meiner Erfahrung sehr langsam mit Einfügen und ist der Standard für neue dbs. entfernen Sie Fremdschlüssel so weit wie möglich
Wenn Ihr Problem wirklich mit einem einzigen eindeutigen Index zusammenhängt, könnte innodb den Trick machen.
Tags und Links hibernate jpa-2.0 spring-data bulkinsert