2011-12-15 3 views
1

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

Répondre

0

EntityManager n'est pas adapté aux threads. C'est pourquoi on dit souvent que vous ne devez pas injecter EntityManager dans des instances partagées comme des servlets. Il est clairement documenté (JSR-317 la page 286):

An entity manager must not be shared among multiple concurrently executing threads, as the entity manager and persistence context are not required to be threadsafe. Entity managers must only be accessed in a single-threaded manner.

+0

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

Questions connexes