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;
}
È questo corretto dire che, anche se l'ambito predefinito di bean Spring è singleton,
EntityManager
è thread-safe poiché Spring utilizzaThreadLocal
per associare la sua transazione eEntityManager
ad esso?L'esempio Servlets sopra è ancora valido in primavera? Non è ancora sicuro per i thread?
L'approccio
ThreadLocal
funziona solo per i bean gestiti da Spring e il servlet plain non è uno di quelli?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?
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. –
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