Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie Hibernate Batch Insert funktioniert?

Hibernate-Eigenschaft hibernate.jdbc.batch_size ist eine Möglichkeit für Hibernate, Ihre Insert- oder Update-Anweisung zu optimieren, während es bei der Flushing-Schleife um die Erschöpfung des Speichers geht.

Ohne Batchsize, wenn Sie versuchen, eine Entity Hibernate Fire 1 Insert-Anweisung zu speichern, also wenn Sie mit einer großen Sammlung arbeiten, für jede Save Hibernate Fire 1-Anweisung

Stellen Sie sich den folgenden Codeabschnitt vor:

for(Entity e : entities){
session.save(e);
}

Hier wird hibernate 1 insert-Anweisung pro Entität in Ihrer Sammlung auslösen. Wenn Sie 100 Elemente in Ihrer Sammlung haben, werden 100 Insert-Anweisungen ausgelöst. Dieser Ansatz ist aus zwei Hauptgründen nicht sehr effizient:

  • 1) Du erhöhst deinen 1st Level Cache exponentiell und wirst wahrscheinlich bald mit einer OutOfMemoryException enden .
  • 2) Sie verschlechtern die Leistung aufgrund des Netzwerk-Roundtrips für jede Anweisung.

hibernate.jdbc.batch_size und die Spülschleife haben 2 unterschiedliche Zwecke, sind aber komplementär.

Hibernate verwendet die erste, um zu steuern, wie viele Entitäten im Batch vorhanden sein werden. Verwenden Sie unter dem Deckmantel Hibernate java.sql.Statement.addBatch(...) und executeBatch() Methoden.

Also teilt hibernate.jdbc.batch_size Hibernate mit, wie oft es addBatch() aufrufen muss vor dem Aufruf von executeBatch() .

Das Setzen dieser Eigenschaft verhindert also nicht, dass der Speicher erschöpft ist.

Um den Speicher zu pflegen, müssen Sie Ihre Sitzung regelmäßig leeren, und dies ist der Zweck der Spülschleife.

Wenn Sie schreiben:

for(Entity e : entities){
if (i % 100 == 0 && i>0) {
                    session.flush();
                    session.clear();
                }
}

Sie weisen Hibernate an, die Sitzung alle 100 Entitäten zu leeren und zu löschen (Sie geben Speicher frei).

Also, was ist nun die Verbindung zwischen den 2 ?

Um optimal zu sein, müssen Sie Ihre jdbc.batch_size definieren und Ihre Spülparameter identisch.

Wenn Sie einen Flush-Parameter definieren, der niedriger ist als die von Ihnen gewählte Batch_Size, wird der Ruhezustand die Sitzung häufiger leeren, sodass ein kleiner Batch erstellt wird, bis er die Btach-Größe erreicht, was nicht effizient ist

wenn die beiden gleich sind, führt hibernate nur Batches mit optimaler Größe aus, mit Ausnahme des letzten, wenn die Größe der Sammlung kein Vielfaches Ihrer Batch_size ist.

Sie können Folgendes sehen:posten für weitere Einzelheiten zu diesem letzten Punkt