J'ai un sérieux problème avec la persistance des entités dans la base de données. Quelle que soit la façon dont je gère la couche de dépôt, j'ai toujours le problème de l'utilisation croissante du tas Java.
Mon objectif est simple : Pas d'exception OutOfMemoryException avec ce pseudo Code :
while(true) { repo.save(someEntity) }
Le code dans la boucle doit être transactionnel. Cela signifie qu'après chaque boucle, il doit y avoir un commit transactionnel dans la base de données.
Remarque : dans mon cas réel, il ne s'agit pas d'une boucle permanente while(true) mais le processus peut durer jusqu'à 3h. Je teste juste le comportement de la mémoire avec une fonction simple comme celle-là.
Le problème est une utilisation croissante de Java Heap. Dans cet exemple, j'ai exécuté l'application avec : java -jar -Xmx128M -Xms128M app.jar
Ce que j'ai déjà essayé :
Création d'un nouvel EntityManger pour chaque transaction
val em = entityManagerFactory.createEntityManager()
em.transaction.begin()
em.persist(someEntity)
em.transaction.commit()
em.close
Travailler avec @Transactional
@Service
class Foo {
@Autowired
private Bar bar;
@Transactional(propagation = Propagation.NEVER)
public void loop() {
while (true) {
bar.save();
}
}
}
@Service
class Bar {
@Transactional(propagation = Propagation.REQUIRED)
public void save() {
repo.save();
}
}
Quelqu'un sait-il ce que je fais mal ? Est-il possible d'effectuer une telle tâche avec Spring Boot ?