Mysql
 sql >> Base de données >  >> RDS >> Mysql

Insertion en masse ou mise à jour avec Hibernate ?

Il existe de nombreux goulots d'étranglement possibles dans les opérations en masse. La meilleure approche dépend fortement de l'apparence de vos données. Consultez le Manuel Hibernate section sur le traitement par lots.

Au minimum, assurez-vous d'utiliser le modèle suivant (copié du manuel) :

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();

Si vous mappez un fichier plat sur un graphique d'objets très complexe, vous devrez peut-être faire preuve de plus de créativité, mais le principe de base est que vous devez trouver un équilibre entre pousser des blocs de données de bonne taille vers la base de données à chaque vidage/commit et éviter exploser la taille du cache au niveau de la session.

Enfin, si vous n'avez pas besoin d'Hibernate pour gérer les collections ou la mise en cascade pour que vos données soient correctement insérées, pensez à utiliser un StatelessSession .