Necesito procesar un archivo CSV y para cada registro (línea) persistir una entidad. En este momento, lo hago de esta manera:Cómo persistir muchas entidades (JPA)
while ((line = reader.readNext()) != null) {
Entity entity = createEntityObject(line);
entityManager.save(entity);
i++;
}
donde el método save(Entity)
es básicamente una llamada EntityManager.merge()
. Hay aproximadamente 20,000 entidades (líneas) en el archivo CSV. ¿Es esta una manera efectiva de hacerlo? Parece ser bastante lento. ¿Sería mejor usar EntityManager.persist()
? ¿Esta solución está defectuosa de alguna manera?
EDITAR
Es un proceso largo (más de 400s) y yo trataba de ambas soluciones, con persist
y merge
. Ambos tardan aproximadamente el mismo tiempo en completarse (459s frente a 443s). La pregunta es si guardar las entidades una por una como esta es óptimo. Por lo que sé, Hibernate (que es mi proveedor de JPA) implementa algunas funciones de caché/descarga, por lo que no debería tener que preocuparse por esto.
Puede verificar hibernate.jdbc.batch_size e hibernate.jdbc.use_getGeneratedKeys (pero no se puede establecer por transacción). –