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

Masseneinfügung oder Aktualisierung mit Hibernate?

Es gibt viele mögliche Engpässe bei Massenvorgängen. Der beste Ansatz hängt stark davon ab, wie Ihre Daten aussehen. Sehen Sie sich das Hibernate-Handbuch Abschnitt zur Stapelverarbeitung.

Stellen Sie mindestens sicher, dass Sie das folgende Muster verwenden (aus dem Handbuch kopiert):

Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();

for ( int i=0; i<100000; i++ ) {
Customer customer = new Customer(.....);
session.save(customer);
    if ( i % 20 == 0 ) { //20, same as the JDBC batch size
        //flush a batch of inserts and release memory:
        session.flush();
        session.clear();
    }
}

tx.commit();
session.close();

Wenn Sie eine flache Datei einem sehr komplexen Objektdiagramm zuordnen, müssen Sie möglicherweise kreativer werden, aber das Grundprinzip besteht darin, dass Sie ein Gleichgewicht zwischen dem Übertragen von großen Datenblöcken in die Datenbank bei jedem Flush/Commit und dem Vermeiden finden müssen Explodieren der Größe des Caches auf Sitzungsebene.

Schließlich, wenn Sie Hibernate nicht benötigen, um Sammlungen oder Kaskadierung zu handhaben, damit Ihre Daten korrekt eingefügt werden, sollten Sie die Verwendung eines StatelessSession .