2010-12-28 7 views
24

Ok, he leído un montón de artículos/ejemplos sobre cómo escribir Entity Manager Factory en singleton.¿Cuándo se debe crear/abrir la instancia de EntityManagerFactory?

Uno de ellos más fácil de entender para mí un poco:

http://javanotepad.blogspot.com/2007/05/jpa-entitymanagerfactory-in-web.html

supe que EntityManagerFactory (EMF) sólo se creará una vez preferentemente en el alcance de la aplicación. (?)

Y también asegúrese de cerrar la FEM una vez que se utiliza

así que escribí clase de ayuda EMF para los métodos de negocio a utilizar:

public class EmProvider { 

    private static final String DB_PU = "KogaAlphaPU"; 

    public static final boolean DEBUG = true; 

    private static final EmProvider singleton = new EmProvider(); 

    private EntityManagerFactory emf; 

    private EmProvider() {} 

    public static EmProvider getInstance() { 
     return singleton; 
    } 


    public EntityManagerFactory getEntityManagerFactory() { 
     if(emf == null) { 
      emf = Persistence.createEntityManagerFactory(DB_PU); 
     } 
     if(DEBUG) { 
      System.out.println("factory created on: " + new Date()); 
     } 
     return emf; 
    } 

    public void closeEmf() { 
     if(emf.isOpen() || emf != null) { 
      emf.close(); 
     } 
     emf = null; 
     if(DEBUG) { 
      System.out.println("EMF closed at: " + new Date()); 
     } 
    } 

}//end class 

Y mi método usando EmProvider:

public String foo() { 
    EntityManager em = null; 
    List<Object[]> out = null; 
    try { 

     em = EmProvider.getInstance().getEntityManagerFactory().createEntityManager(); 
     Query query = em.createNativeQuery(JPQL_JOIN); //just some random query 
     out = query.getResultList(); 
    } 
    catch(Exception e) { 
     //handle error.... 
    } 
    finally { 
     if(em != null) { 
      em.close(); //make sure to close EntityManager 
     } 
     //should I not close the EMF itself here????? 
     EmProvider.getInstance().closeEmf(); 
    } 

Me aseguré de cerrar EntityManager (em) dentro del nivel de método como se sugiere. Pero ¿cuándo se debe cerrar EntityManagerFactory? ¿Y por qué EMF tiene que ser singleton tan malo? Leí sobre problemas de simultaneidad, pero como no tengo experiencia en la gramática de múltiples hilos, no puedo ser claro sobre esta idea.

+1

"¿Y por qué EMF tiene que ser singleton tan malo ???" esta afirmación probablemente debería abrir otra pregunta ... –

Respuesta

51
  • casos EntityManagerFactory son objetos de peso pesado. Cada fábrica puede mantener un caché de metadatos, caché de estado de objeto, EntityManager grupo, grupo de conexiones y más. Si el su aplicación ya no necesita un EntityManagerFactory, debe cerrarlo para liberar estos recursos .

  • Cuando un EntityManagerFactory cierra, todos EntityManagers de esa fábrica, y por extensión a todas las entidades gestionadas por esos EntityManagers, convertido válido.

  • Es mucho mejor mantener una fábrica abierta durante un largo período de tiempo que repetidamente crear y cerrar nuevos fábricas. Por lo tanto, la mayoría de las aplicaciones nunca cierran la fábrica, o solo la cierran cuando la aplicación está saliendo de .

  • Sólo las aplicaciones que requieren múltiples fábricas con diferentes configuraciones tienen una razón obvia para crear y cerrar múltiples instancias EntityManagerFactory.

  • Sólo una EntityManagerFactory es que se podrán crear para cada configuración persistencia desplegado unidad . Cualquier número de instancias de EntityManager puede ser creado desde una fábrica determinada.

  • Más de una entidad de fábrica instancia puede estar disponible simultáneamente en la JVM.Los métodos de la interfaz EntityManagerFactory son seguros para la ejecución de hilos.
+3

Creo que 'EntityManagerFactory' no se debe cerrar para una aplicación web en línea. – abbas

+1

Debe estar cerrado, pero solo cuando la aplicación web se detiene (el usuario la detiene o la anula). Ejemplo: implementación del contexto Método destruido de la interfaz ServletContextListener al usar JSF – GabrielBB

+1

@ pvm14 Sí, definitivamente. Si tiene que ir por su camino y si está todo en la documentación y todo el mundo lo entiende, stackoverlow no habría entrado en escena. La gente no ha votado innecesariamente. Si no te gusta, déjalo, abstente de publicar comentarios irrelevantes, en su lugar intenta agregar más información, detalles, errores, etc. si puedes, lo que ayudaría a todos. –

Cuestiones relacionadas