J'essaie de reproduire (et non de tester complètement le problème du multithreading) le problème du bloc de threads dans l'une de mes méthodes en écrivant un test unitaire. Depuis que je vois beaucoup de cas dePlusieurs threads démarrant une transaction dans JUNIT
org.hibernate.exception.LockAcquisitionException: could not execute update query
dans notre 2 serveur environnement PROD, je devrais être en mesure de reproduire assez facilement dans mon test unitaire. J'ai essayé d'engendrer plusieurs threads dans ma méthode JUnit et chaque thread appelant ma méthode. J'ai essayé avec 2 threads pour commencer.
ExecutorService exec = Executors.newFixedThreadPool(16);
for (int i = 0; i < 2; i++) {
exec.execute(new Runnable() {
public void run() {
System.out.println("who is running: " + Thread.currentThread().getId());
em.getTransaction().begin();
//do something()
em.getTransaction().commit();
}
});
}
Je reçois une erreur:
Exception in thread "pool-1-thread-2" who is running: 11
java.lang.IllegalStateException: Transaction already active
at org.hibernate.ejb.TransactionImpl.begin(TransactionImpl.java:35)
Il ne me permet de créer des transactions pour le deuxième thread avec une erreur 'transaction est déjà actif'. Je pensais que EntityManager pourrait avoir plusieurs threads actifs présents à un moment donné (et donc un gestionnaire d'entité singleton)?
Ai-je raté quelque chose ici?
Merci
J'ai essayé de créer EntityManagers multiples et de les associer pour chaque fil, mais après le 1er fil que je rencontre encore « Le fil est déjà actif » crée un Tx actif. – phewataal