2010-04-06 9 views
17

Je suis l'apprentissage de JPA et ai une question:Quand avons-nous besoin de plus d'un EntityManager?

Dans quels cas nous avons besoin de plus d'un EntityManager dans notre application?

Les deux situations que je suis au courant sont les suivantes:

  • Lorsque notre application est une application multi-thread et plus d'un thread a besoin transaction JPA parce EntityManager est thread-safe et nous avons besoin un EntityManager par fil.

  • Lorsqu'un du fil a besoin de plusieurs transactions simultanées, nous avons besoin de plus d'un EntityManager dans ce fil parce qu'il ya une relation univoque entre EntityManager et EntityTransaction.


Q1. Y a-t-il d'autres situations où nous avons besoin de plus d'un EntityManager?

Q2. Jusqu'à ma compréhension, il devrait y avoir un seul EntityManagerFactory par unité de persistance. Ai-je raison? Si non, alors quelles sont ces situations lorsque nous avons besoin de plusieurs EntityManagerFactory par unité de persévérance?

Répondre

11

Q1: Le EntityManager est le meilleur à comparer avec le « bon vieux » Mise en veille prolongée Session: une unité de travail (une simple action entreprise, par exemple « l'exploitation forestière dans un utilisateur », « passer une commande », etc.). Ce n'est pas nécessairement lié à un seul thread. Vous ne rencontrerez des problèmes que si les différents threads exécutent des tâches DB qui dépendent l'une de l'autre dans une même unité de travail. Vous auriez besoin de les exécuter en synchronisation (de préférence, dans l'ordre dans un seul thread). Si vous avez par exemple l'exigence métier pour nettoyer certains «anciens journaux» lorsqu'un utilisateur se connecte (ce qui ne perturberait pas raisonnablement l'information de l'autre), vous pouvez parfaitement l'exécuter en deux threads séparés dans une même unité de travail.

Q2: Votre compréhension est correcte. Vous pouvez cependant en créer plus d'un, mais cela n'aurait aucun sens et n'aurait aucun avantage. Cela ne ferait qu'ajouter des frais généraux importants.

+0

Pour Q1: Je suppose qu'un objet _Entity Manager_ devrait avoir un surcoût minime, mais je suis toujours impatient de demander combien de temps :) Wow, que les threads diff qui dépendent les uns des autres est plus complexe. Alors est-il sûr de dire que vous devriez avoir 1 EM par Thread? Ensuite, vous vous assurez que vous attrapez des exceptions puisque vous avez plusieurs threads en utilisant la même table, non? – thirdy

+0

Oui, puisque EM n'est pas thread-safe, peut-il être utilisé sur plusieurs threads si je crée un wrapper autour et inclure des méthodes de sauvegarde/mise à jour 'synchronisées' dans l'encapsuleur qui appelle en interne save/update de EM. Aussi je ne jamais effacer/fermer le EM? Je pense qu'il peut encore y avoir des problèmes pour la lecture et l'écriture simultanées. Pourriez-vous me faire part de vos commentaires à ce sujet? – bluelurker

Questions connexes