Hibernate Batch einfügen. Würde es jemals einen Einsatz statt mehrerer Einsätze verwenden?

8

Ich habe mich umgesehen und versucht, ein gewisses Hibernate-Verhalten festzustellen, über das ich mir nicht sicher bin. In einem Szenario, in dem das Hibernate-Batching ordnungsgemäß eingerichtet ist, werden immer nur mehrere INSERT-Anweisungen verwendet, wenn ein Batch gesendet wird. Ist es nicht möglich, eine DB-unabhängige Multi-Insert-Anweisung zu verwenden?

Ich denke, ich versuche herauszufinden, ob ich die Batching-Funktion korrekt eingerichtet habe. Ich sehe die multiple insert-Anweisungen, aber dann sehe ich auch die Zeile "Batch-Größe ausführen: 25."

Es gibt viel Code, den ich schreiben könnte, aber ich versuche, das allgemein zu halten. Also, meine Fragen sind:

1) Was können Sie in den Protokollen lesen, um sicher zu sein, dass das Batching verwendet wird?

2) Ist es möglich, dass Hibernate eine mehrzeilige Insert-Anweisung gegenüber mehreren Insert-Anweisungen verwendet?

    
AHungerArtist 29.05.2011, 07:53
quelle

4 Antworten

8

Hibernate verwendet mehrere Einfügeanweisungen (eine pro einzufügende Entität), sendet sie jedoch im Stapelmodus an die Datenbank (mit Statement.addBatch() und Statement.executeBatch() ). Aus diesem Grund sehen Sie im Protokoll mehrere INSERT-Anweisungen, aber auch "Batchgröße ausführen: 25".

Die Verwendung von Batch-Anweisungen reduziert die Anzahl der Roundtrips in der Datenbank erheblich, und ich wäre überrascht, wenn es weniger effizient wäre, als eine einzelne Anweisung mit mehreren Einfügungen auszuführen. Darüber hinaus ermöglicht es auch das Mischen von Updates und Einfügungen, z. B. in einem einzigen Datenbankaufruf.

Ich bin mir ziemlich sicher, dass es nicht möglich ist, Hibernate dazu zu bringen, mehrzeilige Einfügungen zu verwenden, aber ich bin mir auch ziemlich sicher, dass es nutzlos wäre.

    
JB Nizet 29.05.2011, 10:29
quelle
2

Ich weiß, dass dies eine alte Frage ist, aber ich hatte das gleiche Problem, dass ich dachte, dass Hibernate Batching bedeutet, dass Hibernate mehrere Einfügungen zu einer Anweisung kombinieren würde, was es anscheinend nicht tut.

Nach ein paar Tests habe ich die Antwort gefunden, dass eine Charge von mehreren Beilagen genauso gut ist wie eine mehrzeilige Beilage. Ich habe einen Test durchgeführt, bei dem einmal 1000 Zeilen im Ruhezustand und einmal ohne Stapel eingefügt wurden. Beide Tests dauerten ungefähr 20 Sekunden, also gab es keine Leistungssteigerung bei der Verwendung des Ruhezustands.

Um sicher zu gehen, habe ich versucht, die rewriteBatchedStatements-Option aus dem MySQL Connector / J zu verwenden, die tatsächlich mehrere Einfügungen in eine Anweisung kombiniert. Die Zeit zum Einfügen von 1000 Datensätzen auf 3 Sekunden wurde reduziert.

Nach all dem Hibernate-Batch scheint das also nutzlos zu sein und ein echter mehrzeiliger Einsatz ist viel besser. Mache ich etwas falsch oder was verursacht meine Testergebnisse?

    
Werzi2001 23.08.2012 13:59
quelle
1

Die Oracle-Masseneinfügung sammelt ein Array von entyty und übergibt einen einzelnen Block an die db, die ihr eine Unicycle-Einfügung / Aktualisierung / Löschung hinzufügt.

Ist eine einfache Möglichkeit, den Netzwerkdurchsatz zu beschleunigen.

Oracle schlägt vor, eine gespeicherte Prozedur vom Hibernate aus aufzurufen und ihr ein Array von Daten zu übergeben.

    
luca peano 23.01.2013 20:45
quelle
0

Ссылка Ist nicht nur ein Softwareproblem sondern infrastrukturell! Problem ist Netzwerk-Datenfluss-Optimierung und TCP-Stack-Fragmentierung. Mysql haben Funktion. Sie müssen etwas tun, was in diesem Artikel beschrieben wird. Normale Übertragung im Netzwerk die richtige Menge an Daten ist die Lösung

Sie müssen auch überprüfen, ob die Nutzung von Netzwerk-MTU und Oracle sdu / tdu die zwischen Anwendung und Datenbank übertragenen Daten berücksichtigt.

    
luca peano 24.01.2013 00:17
quelle

Tags und Links