2010-08-03 17 views
14

estoy aprendiendo APP y el patrón general en los ejemplos parece ser de la siguiente manera:¿Mantiene abierto el administrador de la entidad de JPA?

EntityManager em = factory.createEntityManager(); 
em.getTransaction().begin(); 
// .... 
em.getTransaction().commit(); 
em.close(); 

Ahora me pregunto ¿por qué continuamente creamos y cerrar EntityManagers, en lugar de mantenerlo abierto y acaba de empezar nuevas transacciones? ¿Cuáles son los beneficios y los costos de mantenerlo abierto frente a cerrarlo todo el tiempo?

razones

Respuesta

7

Dos JPA-específicas vienen a la mente:

  1. EntityManager no se garantiza que se threadsafe por la especificación JPA. Por lo tanto, las aplicaciones JPA portátiles solo pueden usar un EM en un hilo a la vez. El modismo de crear un EM local de método y cerrarlo antes de que salga del alcance alienta el confinamiento de la pila de referencias de EM.

  2. Un EM que usa el Contexto de persistencia "Extendida" Lifetime mantiene un único contexto de persistencia para toda su existencia. Esto significa que las entidades dejan de separarse automáticamente en commit(). En su lugar, deben separarse manualmente, de lo contrario, el EM sigue siendo responsable de rastrearlos.

Esta pregunta es realmente una versión específica de JPA de la antigua pregunta "cuando agrupar objetos". Esa es una pregunta difícil, pero la respuesta probablemente sea "raramente".

Este old developerWorks post del experto en concurrencia de Java Brian Goetz expone el punto. Los pools: gist tienen mucho sentido para los objetos costosos, como las conexiones de bases de datos. Pero para objetos de vida corta, pequeños y de inicialización rápida, como EntityManager, la puesta en común o alguna otra forma de retención de referencia a largo plazo es difícil de vender.

Pero, es una pregunta general, por lo que es probable que haya excepciones. Tal vez la aplicación es simple o singlethreaded. Entonces estas preocupaciones sobre la seguridad de hilos se vuelven discutibles.

5

Mantener un administrador de entidades abierto evita que regrese su conexión al grupo de conexiones.

Esto puede provocar varios problemas, especialmente en aplicaciones web, p. cuando el grupo se ejecuta completo y se alcanza el tamaño máximo de conexión, ningún otro usuario puede obtener una conexión de base de datos que impida el acceso a la base de datos para ese usuario.

En este caso, es mejor tener gerentes de entidades de vida corta, p. abrir el administrador de entidades al comienzo de una solicitud y cerrarlo al final de una solicitud (se puede hacer con oyentes/interceptores ...). Las entidades se separan y debe volver a adjuntarlas si desea volver a utilizarlas (utilizando la operación de fusión del administrador de entidades).

Cuestiones relacionadas