source data java hibernate orm jpa batch-insert

java - data - Inserciones de lote con JPA/EJB3



persistence xml hibernate java (5)

¿El marco JPA / EJB3 proporciona una forma estándar de realizar operaciones de inserción de lotes ...? Utilizamos hibernate para el marco de persistencia, por lo que puedo recurrir a Hibernate Session y usar la combinación session.save () / session.flush () para lograr la inserción de lotes. Pero me gustaría saber si EJB3 tiene soporte para esto ...


Con el número de registros medio puede usar de esta manera:

em.getTransaction().begin(); for (int i = 1; i <= 100000; i++) { Point point = new Point(i, i); em.persist(point); if ((i % 10000) == 0) { em.flush(); em.clear(); } } em.getTransaction().commit();

Pero con un número de registros grande, debe realizar esta tarea en varias transacciones:

em.getTransaction().begin(); for (int i = 1; i <= 1000000; i++) { Point point = new Point(i, i); em.persist(point); if ((i % 10000) == 0) { em.getTransaction().commit(); em.clear(); em.getTransaction().begin(); } } em.getTransaction().commit();

Ref: JPA Batch Store


Ni JPA ni Hibernate brindan un soporte particular para las inserciones por lotes y la expresión idiomática para las inserciones por lotes con JPA sería la misma que con Hibernate:

EntityManager em = ...; EntityTransaction tx = em.getTransaction(); tx.begin(); for ( int i=0; i<100000; i++ ) { Customer customer = new Customer(.....); em.persist(customer); if ( i % 20 == 0 ) { //20, same as the JDBC batch size //flush a batch of inserts and release memory: em.flush(); em.clear(); } } tx.commit(); session.close();

Usar la API patentada de Hibernate en este caso no proporciona ninguna ventaja IMO.

Referencias


Para hibernar específicamente, todo el capítulo 13 del manual básico explica los métodos.

Pero está diciendo que quiere el método EJB a través de Hibernate, por lo que la documentación del administrador de entidades también tiene un capítulo sobre eso here . Sugiero que lea ambos (el núcleo y el administrador de la entidad).

En EJB, se trata simplemente de usar EJB-QL (con algunas limitaciones). Sin embargo, Hibernate proporciona más mecanismos si necesita más flexibilidad.


Pascal

En su ejemplo para insertar 100000 registros, se realiza dentro de una sola transacción, ya que el compromiso () solo se llama al final. ¿Pone mucha presión en la base de datos? Además, en caso de que haya una reversión, el costo será demasiado ...

¿El siguiente enfoque será mejor?

EntityManager em = ...; for ( int i=0; i<100000; i++ ) { if(!em.getTransaction().isActive()) { em.getTransaction().begin(); } Customer customer = new Customer(.....); em.persist(customer); if ((i+1) % 20 == 0 ) { //20, same as the JDBC batch size //flush and commit of inserts and release memory: em.getTransaction().commit(); em.clear(); } } session.close();


Sí, puede retroceder a su implementación de JPA si lo desea para tener el control que definió.

JPA 1.0 es rico en EL-HQL pero ligero en el soporte API de Criteria, sin embargo esto se ha abordado en 2.0.

Session session = (Session) entityManager.getDelegate(); session.setFlushMode(FlushMode.MANUAL);