2010-01-06 6 views
4

Selon de nombreux exemples, il est possible d'injecter un EntityManager dans @Stateless ou @Singleton EJBs comme ceci:Comment garantir la sécurité des threads avec @PersistenceContext?

@Stateless // or @Singleton 
public class MyRepository { 
    @PersistenceContext 
    private EntityManager em; 
    ... 
} 

L'EJB 3.1 Spec dit que l'injection de dépendance est effectuée uniquement au moment de la construction, de sorte que tous les appelants de MyRepository utiliserait la même instance de EntityManager. Comment le conteneur EJB s'assure-t-il que l'instance EntityManager correcte est utilisée?

+0

Bonne question ... Je me suis souvent posé des questions sur les rouages ​​de la sécurité des threads dans les implémentations JEE5 +. – jsight

Répondre

3

Je crois comprendre qu'un bean @Stateless ne sera jamais utilisé simultanément par deux clients; le conteneur créera simplement plus d'instances du même bean s'il doit servir plusieurs clients.

Quant à @Singleton haricots, le spec dit que, par défaut, ils utilisent des conteneurs gérés Concurrency, où le conteneur utilise la méthode Lock s et pourrait rejeter ses clients une exception de délai d'attente si le singleton est occupé.

Edit: en outre, le type @PersistentContext est scope transaction par défaut (16.11.1.1 dans la spécification), de sorte l'ensemble des entités gérées par EntityManager sont détachés à la fin de chaque opération.

+0

Je suis d'accord avec vous, même si le verrouillage en singletons peut être personnalisé. Mais il y a un autre point: l'injection n'est effectuée que sur la création du bean puis utilisée par plusieurs appelants (simultanément ou non). – deamon

+0

Le contexte de persistance est défini sur la transaction par défaut. –