2010-04-06 13 views
17

Sto imparando JPA e ho una domanda:Quando abbiamo bisogno di più di un EntityManager?

In quali situazioni abbiamo bisogno di più di uno EntityManager nella nostra applicazione?

Le due situazioni che sono a conoscenza sono i seguenti:

  • Quando la nostra applicazione è un'applicazione multi-threaded e più di un thread ha bisogno di un'operazione APP perché EntityManager non è thread-safe e abbiamo bisogno uno EntityManager per thread.

  • Quando qualsiasi del filo deve più transazioni simultanee, dobbiamo più EntityManager in quel filo perché c'è uno-a-uno tra EntityManager e EntityTransaction.


Q1. Ci sono altre situazioni in cui abbiamo bisogno di più di uno EntityManager?

Q2. A mio avviso, dovrebbe esserci solo uno EntityManagerFactory per Persitence Unit. Ho ragione? In caso contrario, quali sono quelle situazioni in cui è necessario più EntityManagerFactory per unità di persistenza?

risposta

11

Q1: Il EntityManager è meglio essere confrontato con il "buon vecchio" Hibernate Session: un'unità di lavoro ("la registrazione in un utente" una semplice azione di business, ad esempio, "un ordine", ecc). Non è necessariamente legato a un singolo thread. Esegui solo guai se i diversi thread eseguono attività DB che dipendono l'una dall'altra all'interno di una singola unità di lavoro. Dovresti eseguirli in sincrono (preferibilmente, in ordine in un singolo thread). Se, per esempio, hai il requisito aziendale di ripulire alcuni "vecchi log" quando un utente effettua l'accesso (il che ragionevolmente non disturba le informazioni altrui), puoi eseguirlo perfettamente in due thread separati all'interno di una singola unità di lavoro.

Q2: la vostra comprensione è corretta. Puoi comunque crearne più di uno, ma ciò non avrebbe alcun senso né alcun vantaggio. Aggiungerebbe solo un sovraccarico significativo.

+0

Per Q1: Immagino che un oggetto _Entity Manager_ debba avere un sovraccarico minimo, ma sono ancora prurito di chiedere quanto overhead :) Wow, i thread diff che dipendono l'uno dall'altro è più complesso. Quindi è sicuro dire che dovresti avere 1 EM per discussione? Quindi assicurati di rilevare eventuali eccezioni poiché hai più thread che utilizzano la stessa tabella, giusto? – thirdy

+0

Sì, poiché EM non è thread-safe, può essere utilizzato su più thread se creo un wrapper e includo metodi di salvataggio/aggiornamento 'sincronizzati' nel wrapper che chiamano internamente save/update di EM. Inoltre non cancello/chiudo mai EM? Penso che ci possano ancora essere problemi per la lettura e la scrittura simultanee. Potrebbe farmi sapere i vostri commenti su questo? – bluelurker

Problemi correlati