2012-04-30 12 views
10

EntityManager è non thread-safe per definizione. Le specifiche delle servlet indicano che in ambiente non distribuito e senza l'implementazione di SingleThreadModel, c'è solo un'istanza di servlet per definizione.@PersistenceContext EntityManager thread-safety in Spring e Java EE

Pertanto, in Java EE, quando si inietta un EntityManager attraverso il @PersistenceContext nel campo di Servlet - non è thread-safe:

public class MyServlet extends HttpServlet { 

    // Not thread-safe, should be using EMF instead. 
    @PersistenceContext 
    private EntityManager em; 
} 
  1. È questo corretto dire che, anche se l'ambito predefinito di bean Spring è singleton, EntityManager è thread-safe poiché Spring utilizza ThreadLocal per associare la sua transazione e EntityManager ad esso?

  2. L'esempio Servlets sopra è ancora valido in primavera? Non è ancora sicuro per i thread?

  3. L'approccio ThreadLocal funziona solo per i bean gestiti da Spring e il servlet plain non è uno di quelli?

  4. Per quanto mi ricordo, è la responsabilità del contenitore di iniettare lo EntityManager. Nell'implementazione Java EE di Glassfish, era il server delle applicazioni a scoprire il punto di iniezione @PersistenceContext.
    Come appare in primavera? Il Framework di primavera è responsabile per la scoperta di tali annotazioni o è responsabilità dell'implementatore di JPA?

risposta

5

Domanda 2, 3 e 4 - La primavera non presta attenzione a nessuna classe che non sia un fagiolo di primavera. Per questo Spring non presta attenzione alla classe MyServlet. Quindi la risposta per

  • 2) c'è
  • 3) solo Primavera gestito Fagioli
  • 4) è Springs responsabilità, perché la primavera è il contenitore

per la domanda 1). Funziona in questo modo, quindi l'utilizzo di un gestore di entità iniettate di primavera è un efficace salvataggio del thread.

+0

Grazie Ralph. Quindi, dicendo "2) no" intendi che non è thread-safe perché questo servlet non è un bean Spring, quindi in effetti ** non si verificherà alcuna iniezione **? È possibile contrassegnare tale Servlet come un fagiolo di primavera? In qualche modo sento che è un'idea piuttosto insolita, non raccomandata e disordinata - è solo una questione teorica per capire il meccanismo di Spring. –

+1

Voglio dire che non è affatto un bean Spring (questo è il primo paragrafo), quindi non c'è l'iniezione e 'em' sarà nullo. - Provalo, se non è nulla, allora succede qualcosa di davvero strano. Un modo per provare a renderlo un bean spring è '@ Configurable', ma questo richiede AspectJ reale e non ho davvero idea se questo funzioni per Servlet. – Ralph