JAVA: un objet EntityManager dans un environnement multithread
si j'ai plusieurs threads, chaque utilisation de l'injecteur pour obtenir l'objet EntityManager, chaque utilisation de l'em de l'objet à sélectionner une liste d'autres objets de la classe. Prêt à être utilisé dans une boucle for.
Si un thread termine premier et appels clear(), sera l'impact sur les autres threads? Comme pour la boucle sera d'exception?
Comment sur close()?
Si la réponse est "Ça dépend", ce qui (définition de la classe? appel de la méthode?) et où (code java? annotation? xml?) dois-je regarder pour savoir comment c'était?
Je n'ai pas écrit la source, je suis juste à l'aide de quelqu'un d'autre de la bibliothèque sans documentation.
Merci.
- Pouvez-vous détailler un peu au sujet de votre injecteur mécanisme et comment est l'EntityManager instance .Par exemple est-il un printemps de l'application .Êtes-vous à l'aide de OpenEntityManagerInViewFilter ?
- Oui, bien sûr. La même EntityManager instance/objet est de passer dans la bibliothèque, mais je ne vois pas toute fonction publique pour moi de le faire. J'ai donc utilisé le com.google.injecter.Injecteur pour obtenir une instance de l'utiliser dans mes fonctions.
Vous devez vous connecter pour publier un commentaire.
Ici est plein de travail
thread-safe Entity Manager Helper
.Les gestionnaires de l'entité ne sont pas thread-safe (source Java EE 6 tutoriel) et ne peuvent être partagées entre les threads. Chaque thread doit utiliser son propre gestionnaire d'entité ou de mauvaises choses vont se produire, indépendamment de
clear()
ouclose()
appels.Mais, si l'injecteur est l'injection de chaque fil avec son propre gestionnaire d'entité alors le tout devrait être OK.
Printemps et peut-être d'autres DI cadres d'injecter un ThreadLocal proxy pour un véritable gestionnaire d'entité dans vos haricots. Les appels que chaque thread fera proxy pour le véritable fil conducteur-instance locale de l'entité gestionnaire de l' - c'est la façon dont les choses peuvent travailler, même si cela peut paraître un gestionnaire d'entités est partagé entre plusieurs threads.
Plus de détails sur la façon dont votre gestionnaire d'entités est injecté aiderait (Printemps, etc.)
Il existe deux types de gestion de l'EntityManager: gérée par le conteneur et géré par l'application. Pour géré par l'application, la méthode préférée de l'obtention de l'EntityManager est par le biais de EntityManagerFactory. Java EE tutoriel dit ceci:
http://docs.oracle.com/javaee/6/tutorial/doc/bnbqw.html
Vous avez normalement transactions autour de ce que vous faites avec des objets de base de données. Ce que chaque thread donné le voit sur les modifications apportées par d'autres threads est contrôlé par des transactions "à l'isolement" des paramètres.
Commencer à apprendre sur les différents paramètres d'isolation et d'appliquer le bon réglage en fonction de vos besoins. Il y a un compromis entre la précision et la vitesse.
http://en.wikipedia.org/wiki/Isolation_%28database_systems%29
Je suis en congé de trois ans :), mais autant que l'injection d'un EntityManager dans les Ejb est concerné, voici un lien vers Adam Bien de l'entrée de blog http://www.adam-bien.com/roller/abien/entry/is_in_an_ejb_injected
copier-coller à partir de là:
"Vous pouvez injecter de l'EntityManager directement dans les Ejb. Mais: est-ce "thread-safe"?:
"
et la réponse est, de nouveau copier-coller:
"Travailler avec les Ejb sans aucune configuration supplémentaire est thread-safe, peu importe si vous appelez une méthode ou plusieurs méthodes simultanément. Le conteneur se soucie de la sérialisation des appels.",
qui pouvaient peut-être être plus clair, mais cela implique que vous pouvez injecter de l'EntityManager dans les beans de session sans état, et de ne pas être inquiété par l'EntityManager problèmes de concurrence.