Mysql
 sql >> Database >  >> RDS >> Mysql

Inserimento collettivo o aggiornamento con Hibernate?

Ci sono molti possibili colli di bottiglia nelle operazioni in blocco. L'approccio migliore dipende fortemente dall'aspetto dei tuoi dati. Dai un'occhiata al Manuale di sospensione sezione sull'elaborazione batch.

Come minimo, assicurati di utilizzare il seguente schema (copiato dal manuale):

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

Se stai mappando un file flat su un grafico a oggetti molto complesso, potresti dover diventare più creativo, ma il principio di base è che devi trovare un equilibrio tra il push di blocchi di dati di buone dimensioni nel database con ogni flush/commit ed evitare esplodendo la dimensione della cache a livello di sessione.

Infine, se non hai bisogno di Hibernate per gestire le raccolte o il collegamento a cascata per inserire correttamente i tuoi dati, considera l'utilizzo di un StatelessSession .