Pregunta

Una larga pregunta, por favor tengan paciencia conmigo.

Estamos utilizando la primavera + APP para una aplicación web. Mi equipo está debatiendo sobre la inyección de EntityManagerFactory en el GenericDAO (DAO basado en una Genéricos algo en las líneas proporcionadas por AppFuse, no utilizamos JpaDaosupport por alguna razón) sobre la inyección de un EntityManager. Estamos utilizando la "aplicación administrada persistencia".

Los argumentos en contra de la inyección de un EntityManagerFactory es que es demasiado pesado y por lo tanto no se requiere, la EntityManager hace lo que necesitamos. Además, como la primavera crearía una nueva instancia de un DAO para cada solicitud Web (dudo esto) no va a haber ningún problema de concurrencia como en la misma instancia EntityManager es compartida por dos hilos.

El argumento para la inyección de EFM es que es una buena práctica a lo largo de todo su siempre bueno tener un identificador para una fábrica.

No estoy seguro de que es el mejor enfoque, por favor alguien puede iluminar?

¿Fue útil?

Solución

Los pros y los contras de la inyección de EntityManagerFactory vs EntityManager están explicados en los documentos de la primavera aquí , no estoy seguro si puedo mejorar eso.

Dicho esto, hay algunos puntos en su pregunta que debe ser aclarado.

  

... Spring crearía una nueva instancia de   un DAO para cada solicitud Web ...

Esto no es correcto. Si su DAO es un grano de primavera, entonces es un producto único, a menos que se configure de otra manera a través del atributo scope en la definición de frijol. Instancias de un DAO para cada petición sería una locura.

  

El argumento para la inyección de EMF es que   es una buena práctica durante toda su   Siempre es bueno tener un identificador a una   la fábrica.

Este argumento realmente no se sostiene. buena práctica general dice que un objeto debe ser inyectado con los colaboradores mínimos que necesita para hacer su trabajo.

Otros consejos

Me estoy poniendo abajo lo que finalmente se han reunido. Desde la sección " la implementación DAO basado en la llanura de la APP " en la Referencia de primavera:

  

Aunque los casos de EntityManagerFactory son thread-safe, EntityManager   casos no lo son. El inyectado JPA EntityManager se comporta como una   EntityManager recoger del entorno de JNDI de un servidor de aplicaciones,   como se define por la especificación JPA. Delega todas las llamadas al   EntityManager corriente transaccional, en su caso; de lo contrario, cae de nuevo   a un EntityManager recién creada por operación, en efecto, por lo que su   el uso de hilo de seguridad.

Esto significa según las especificaciones de la APP EntityManager casos no es seguro para subprocesos, pero si la primavera las maneja, están hechas de hilo de seguridad.

Si está utilizando la primavera, es mejor inyectar EntityManagers en lugar de EntityManagerFactory.

Creo que esto ya ha sido bien cubierto, pero sólo para reforzar algunos puntos.

  • La DAO, si se inyecta por Spring, es una Singleton por defecto . Tienes que establecer explícitamente el alcance al prototipo para crear una nueva instancia cada vez.

  • El pesebre entidad inyecta por @PersistenceContext es seguro para subprocesos .

Una vez dicho esto, yo tenía algunos problemas con un producto único DAO en mi aplicación multi-hilo. Terminé haciendo que el DAO un grano de instancia y que solucionó el problema. Así, mientras que la documentación puede decir una cosa, es probable que desee probar la aplicación a fondo.

Seguimiento:

Creo que parte de mi problema es que estoy utilizando

@PersistenceContext(unitName = "unit",
    type = PersistenceContextType.EXTENDED)

Si utiliza PersistenceContextType.EXTENDED, tenga en cuenta que usted tiene que, si he entendido bien, cerrar manualmente la transacción. Ver este hilo para más información.

Otro Seguimiento:

El uso de un DAO de instancia es una muy mala idea. Cada instancia de la DAO tendrá su propia caché persistencia y los cambios en una caché no será reconocido por otros granos DAO. Lo siento por el mal consejo.

He encontrado que la fijación de la anotación primavera @Repository en nuestros DAOs y tener EntityManager gestionado por la primavera y se inyecta por @PersistenceContext anotación es la forma más conveniente para conseguir que todo funcione con fluidez. Se beneficia de la seguridad de los subprocesos de la traducción EntityManager y la excepción compartido. Por defecto, el EntityManager compartida gestionará las transacciones si se combinan varios DAOs de un gerente, por ejemplo. Al final, usted encontrará que sus DAOs llegarán a ser anémica.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top