2 votes

Fuite de mémoire dans PersistenceContext

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

enter image description here

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 ?

0voto

Lookslikeitsnot Points 96

JPA met en cache les entités persistantes par défaut. Pour éviter l'exception OutOfMemoryException lors de la persistance de nombreuses entités, mettre le cache à BYPASS .

EntityManager em = ...;
em.setProperty("javax.persistence.cache.storeMode", "BYPASS");

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X