2010-11-19 12 views
25

Tengo un EntityManagerFactory para el que puedo crear uno (o varios) EntityManager instancias. Estoy usando un entorno Servlet y tengo una EntityManagerFactory conectada al servlet (a través del contexto de servlet) que se comparte durante la vida útil del servlet (y, por lo tanto, para todos los usuarios).¿Con qué frecuencia debería crear un EntityManager?

que pueda hacer uno de los siguientes:

  • crear una sola EntityManager durante toda la vida de mi servlet (por ejemplo, compartida entre todos los usuarios)
  • Crear una por usuario (por lo que cada usuario tiene su propio la HttpSession)
  • Crear una por cada petición HTTP (por ejemplo, creando una instancia de una nueva y cerrándola al final de un método doGet)

¿Cuál es el más apropiado? ¿Es significativo el costo de crear un EntityManager? Si hago un solo EntityManager compartido, ¿hay un ámbito de transacción único (es decir, las actualizaciones entre usuarios independientes podrían comprometer otros cambios)?

Respuesta

24

Un EM para todo el servlet no suena bien. Si no está utilizando EM administrados por contenedor (por ejemplo, EJB3), la recomendación es usar un EM para un particular unit of work.

En un contexto de aplicación web, su tercera sugerencia (una por solicitud HTTP) suena bien. Sin embargo, esto puede llevarlo a un error en el que está atando su capa de servicio con su capa de DB (su capa de servicio ni siquiera debe conocer la existencia de un EM).

Otro enfoque sería marcar de forma programática las transacciones en su DAO y obtener su DAO para usar un nuevo EM para cada llamada a un método.

Editar: Los EM son baratos de crear en comparación con los campos electromagnéticos que tienen un importante de arriba. Usar un EMF (que parece que sí) y muchos EMs es el camino a seguir.

+0

De acuerdo. Sugeriría totalmente que utilice un marco de integración como EJB 3 o Spring Framework, que eliminará la carga de la administración de EntityManager. –

1

hacemos un administrador de entidad inyectado para cada slsb, - y el slsb se accede a través de un delegado, de los cuales hay uno por sesión, que busca la interfaz local/remota. Usando ejb3.0.

+0

¿Cómo puede haber un frijol sin estado por sesión? Los beans sin estado por definición no están vinculados a las sesiones. –

+0

@Philipp Jardas editado. Los beans sin estado se definen como que no almacenan el estado/datos conversacionales que se pueden serializar. Entonces, es perfectamente válido crear una instancia de un slsb para cada sesión. Entiendo que tienen mucho menos gastos generales que un SFSB. – NimChimpsky

+0

"válido para crear una instancia de un slsb para cada sesión". ¿Desde cuándo obtuvimos un método de fábrica que nos permite crear instancias EJB sin estado? Creo que quisiste decir EJBs con estado que la aplicación controla el ciclo de vida de (cada búsqueda produce un nuevo bean, y la aplicación tiene que llamar al método @Remove o dejar que bean timeout) o implícitamente controlar el ciclo de vida de CDI (por ejemplo usando @SessionScoped). –

0

Sí, estoy de acuerdo con NimChimpsky y Qwerky en el uso de EJB3.x al acceder a bases de datos y utilizar un EM por unidad de trabajo.

Cuestiones relacionadas