Bulk fügt mit Spring / Hibernate ein

8

Ich verwende in meiner Anwendung einen Mix Spring / Hibernate (nichts Original). Für eine bestimmte Funktion muss ich den Inhalt einer CSV-Datei in eine Tabelle meiner Oracle-Datenbank importieren. Fürs Erste, ich juste die Objekte erstellen, das mache ich

%Vor%

auf jedem von ihnen (Ich muss ihre neu zugewiesene ID abrufen)

Dann erfolgt die Transaktion am Ende der Methode unter Verwendung der Spring-Transaktions-API.

Alles funktioniert gut, außer der Leistung, die für einige 5000 Objekte korrekt ist, aber nicht für 100 000 ...

Ich suche nach Ideen, um dieses Zeug zu beschleunigen. Ich habe von Masseninserts mit Hibernate gehört, konnte aber keine feste Referenz finden. Kann jemand mir einige Ideen geben, um diesen Import mit größerer Leistung durchzuführen?

    
Laurent K 03.08.2009, 13:40
quelle

4 Antworten

7

Etwas Einfaches, das Sie versuchen könnten, ist das Löschen und Löschen der Sitzung, sagen wir alle 100 Objekte ...

, also führe

aus %Vor%

alle 100 oder 1000 Einsätze.

Das spült und löscht die Ruhezustand-Sitzung und stoppt, dass sie zu groß wird (möglicherweise warum Ihre 100 000 Objekte so lange brauchen).

Wenn Sie den identity identifier Generator verwenden, schaltet hibernate automatisch Batch-Inserts aus. Batch-Einsätze verbessern die Leistung. Sie müssen auch die Konfigurationseigenschaft hibernate.jdbc.batch_size eingeben, die Ihrer 100-Nummer entspricht.

Mannings Java Persistence mit Hibernate war die Quelle dafür (großes Buch - rettete meine Haut unzählige Male).

    
Michael Wiles 03.08.2009, 14:45
quelle
6

Sie können auch die Verwendung von StatelessSession erwägen, so wie sie entwickelt wurde Massenoperationen.

%Vor%     
Ray 03.08.2009 13:50
quelle
3

Manchmal ist ein ORMapper nicht der richtige Hammer für den Nagel. Vor allem Batch-Operationen werden oft performanter mit einfachen alten JDBC ausgeführt. Dies hängt natürlich von einer Vielzahl von Bedingungen ab, aber Sie sollten dies zumindest als eine Option sehen und die Leistung beider Ansätze vergleichen.

    
Oliver Gierke 04.08.2009 18:20
quelle
0

Es handelt sich nicht um ein Performance-Problem bei der Datenbankeinfügung. Wenn Sie zehntausende von Objekten erstellen und keine Flush durchführen, wird die Hibernate-Sitzung wachsen, bis Sie nicht mehr genügend Speicherplatz haben.

    
Ken Liu 09.02.2010 18:14
quelle

Tags und Links