2011-02-25 13 views
5

basan en este ejemplo:Spring: @PersistenceContext and @Autowired thread safety?

@Service 
public class Purchase { 
    @PersistenceContext 
    private EntityManager em; 

    @Autowired 
    private PurchaseDAO dao; 

    private String normalField; 

    .... // methods, operations, etc 
} 

Por favor, me ayudan a corregir si estoy equivocada:

  1. La clase de servicio Compra y la PurchaseDAO son únicos que son administrados por el resorte
  2. El campo de la clase de servicio campo normal no es seguro para nada, porque singleton es un objeto único compartido por muchos
  3. Asumamos que el @ Repositorio-anotada-PurchaseDAO tampoco tienen ningún campo, lo que significa que es multi-hilo, se inyectará de forma automática por el resorte
  4. El EntityManager ejemplo es también una propiedad multi-hilo, porque @PersistenceContext hará Asegúrese de que se utilizará el entityManager de la transacción actual.

¡Gracias!

+0

hey @bertie, estoy usando el enfoque '@ PersistenceContext'. pero parece crear una pérdida de memoria. porque la sesión no se aclara experimentaste algo así? – oak

+0

@oak: Lo siento, no estoy seguro porque ha pasado bastante tiempo desde la última vez que jugué con JPA. Le sugiero que cree una nueva pregunta para su problema junto con el entorno, donde coloca el '@ PersistenceContext', etc. – bertie

Respuesta

7
  1. Son singleton por defecto (cuando son gestionados por Spring), a menos que los haya configurado de otra forma (desde la configuración xml o con anotaciones puede configurarlo con @Scope).
  2. Sí y no. Sí, no es seguro en el sentido de que varios subprocesos pueden acceder y modificarlo simultáneamente, y no porque depende del tipo de datos y String es inmutable (y al menos se dice que es seguro para subprocesos). Posiblemente podría explotar si dos hilos diferentes intentaran almacenar una nueva cadena en la variable miembro en el mismo momento.
  3. Sí y no de nuevo. Si el DAO no tiene un estado interno, sí, diría que es seguro para subprocesos, pero los objetos que maneja podrían no serlo (aunque si estás usando entidades JPA, deberían serlo).
  4. Al menos la documentación de Hibernate dice que los administradores de la entidad no son seguros para la impresión en hilos, pero cuando se utiliza un administrador de la entidad inyectado por Spring, no debería ser un problema.

SpringSource forums: He estado buscando respuestas a la misma pregunta en el foro ... El consenso general parece ser que, si bien no se EntityManager hilo de seguridad según especificaciones de la APP, el EntityManager inyectado por la primavera a través de su EntityManager proxy puede ser.

Hibernate: un EntityManager es un objeto de bajo costo, no threadsafe que se debe utilizar una vez, para un solo proceso de negocio, una sola unidad de trabajo, y luego se desecha. Un EntityManager no obtendrá una conexión JDBC (o un origen de datos) a menos que sea necesario, por lo que puede abrir y cerrar un EntityManager de forma segura incluso si no está seguro de que se necesite acceso a datos para atender una solicitud en particular.

+0

2.¿El no tener una propiedad de clase no final siempre hace que la clase no sea segura para subprocesos? Es decir, a pesar de que el tipo de propiedad (Cadena) es inmutable, la propiedad aún se puede cambiar para apuntar a un objeto diferente (otra instancia de Cadena). ¿Eso no hace que la clase se vuelva totalmente insegura para subprocesos? –

+0

Es cierto, aunque depende de cómo se accede, modifica y utiliza la variable miembro (propiedad de la clase), pero en general, diría que existe la posibilidad de que la misma variable se pueda modificar desde dos subprocesos diferentes simultáneamente o se pueda acceder a ella por un tiempo, mientras es modificado por otro, eso haría que la clase no sea segura para subprocesos. Con la sincronización o si la variable solo se lee (o en este caso, la cadena de referencia o toda la cadena podría copiarse a otra referencia fuera de la clase antes del uso), el acceso simultáneo no debería causar ningún problema y, por lo tanto, la clase debería ser a salvo de amenazas. – esaj