sql >> Base de Datos >  >> RDS >> Mysql

¿Inserción masiva o actualización con Hibernate?

Hay muchos cuellos de botella posibles en las operaciones a granel. El mejor enfoque depende en gran medida del aspecto de sus datos. Eche un vistazo al Manual de Hibernate sección sobre procesamiento por lotes.

Como mínimo, asegúrese de utilizar el siguiente patrón (copiado del manual):

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 está asignando un archivo plano a un gráfico de objeto muy complejo, es posible que deba ser más creativo, pero el principio básico es que debe encontrar un equilibrio entre enviar fragmentos de datos de buen tamaño a la base de datos con cada vaciado/confirmación y evitar explotando el tamaño del caché de nivel de sesión.

Por último, si no necesita Hibernate para manejar colecciones o cascadas para que sus datos se inserten correctamente, considere usar un Sesión sin estado .