El lugar adecuado para mirar en el la documentación para este tipo de tratamiento es el total Chapter 13. Batch processing.
Aquí, hay varios errores evidentes en su enfoque actual:
- usted no debe comenzar/confirmar la transacción para cada actualización.
debe activar JDBC de procesamiento por lotes y la puso a un número razonable (10-50):
hibernate.jdbc.batch_size 20
que debiera flush()
y luego clear()
la sesión a intervalos regulares (cada n registros en los que n es igual a el parámetro hibernate.jdbc.batch_size
) o seguirá creciendo y puede explotar (con un OutOfMemoryException
) en algún momento.
A continuación, el ejemplo dado en la sección 13.2. Batch updates ilustrar esto:
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
ScrollableResults customers = session.getNamedQuery("GetCustomers")
.setCacheMode(CacheMode.IGNORE)
.scroll(ScrollMode.FORWARD_ONLY);
int count=0;
while (customers.next()) {
Customer customer = (Customer) customers.get(0);
customer.updateStuff(...);
if (++count % 20 == 0) {
//flush a batch of updates and release memory:
session.flush();
session.clear();
}
}
tx.commit();
session.close();
También puede considerar el uso de la StatelessSession.
Otra opción sería usar DML-style operations (en HQL!): UPDATE FROM? EntityName (WHERE where_conditions)?
.Este ejemplo UPDATE HQL:
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
String hqlUpdate = "update Customer c set c.name = :newName where c.name = :oldName";
// or String hqlUpdate = "update Customer set name = :newName where name = :oldName";
int updatedEntities = s.createQuery(hqlUpdate)
.setString("newName", newName)
.setString("oldName", oldName)
.executeUpdate();
tx.commit();
session.close();
Una vez más, consulte la documentación de los detalles (especialmente cómo tratar con los version
o timestamp
valores de las propiedades utilizando la palabra clave VERSIONED
).
¿De verdad quiso decir * N * Hibernate (en el título)? – M4N
No es para Java - NHibernate es para .NET. – duffymo
arregló el título gracias. – Blankman