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?
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).
Sie können auch die Verwendung von StatelessSession erwägen, so wie sie entwickelt wurde Massenoperationen.
%Vor%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.
Tags und Links hibernate spring bulkinsert