EntityManager
es no thread-safe por definición. Las especificaciones de servlets indican que en entornos no distribuidos y sin implementar SingleThreadModel
, existe solo una instancia de servlet por definición.@PersistenceContext EntityManager thread-safety en Spring y Java EE
Por lo tanto, en Java EE cuando se inyecta un EntityManager
a través de la @PersistenceContext
en el campo de servlet - no es hilo de seguridad:
public class MyServlet extends HttpServlet {
// Not thread-safe, should be using EMF instead.
@PersistenceContext
private EntityManager em;
}
¿Es esto correcto decir que a pesar de que el ámbito predeterminado de los granos de la primavera es singleton, el
EntityManager
es seguro para subprocesos ya que Spring utilizaThreadLocal
para enlazar su transacción yEntityManager
a ella?¿El ejemplo de Servlets anterior sigue siendo válido en Spring? ¿Todavía no es seguro para subprocesos?
¿El enfoque
ThreadLocal
funciona solo para los beans gestionados por Spring y el servlet plano no es uno de esos?Por lo que recuerdo, es responsabilidad del contenedor inyectar el
EntityManager
. En la implementación Glassfish Java EE, fue el servidor de aplicaciones quien descubrió el@PersistenceContext
como punto de inyección.
¿Cómo se ve en primavera? ¿El Spring Framework es responsable de descubrir esas anotaciones o es responsabilidad del implementador de JPA?
Gracias Ralph. Por lo tanto, al decir "2) no es" te refieres a que no es seguro para subprocesos porque este servlet no es un frijol de primavera, por lo que en realidad ** no se producirá ninguna inyección en absoluto **. ¿Es posible marcar dicho servlet como un Spring Bean? De alguna manera siento que es una idea poco común, no recomendable y desordenada; es solo una cuestión teórica comprender el mecanismo de Spring. –
Quiero decir que no es un Spring Bean en absoluto (de eso se trata el primer párrafo), por lo que no hay inyección y 'em' será nulo. - Pruébalo, si no es nulo, entonces algo realmente extraño continúa. Una forma de intentar que sea un bean de primavera es '@ Configurable', pero esto requiere AspectJ real y realmente no tengo idea si esto funciona para Servlets. – Ralph