tutorial mvc mediante libro framework español desarrollo book aplicaciones java jpa singleton entitymanager

java - mvc - ¿Cuándo se debe crear/abrir la instancia de EntityManagerFactory?



spring mvc 4 tutorial español (1)

Ok, leí muchos artículos / ejemplos sobre cómo escribir Entity Manager Factory en singleton.

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

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

Me enteré de que EntityManagerFactory (EMF) solo debe crearse una vez preferiblemente en el ámbito de la aplicación.

Y también asegúrese de cerrar el EMF una vez que se usa (?)

Así que escribí EMF helper class para que los métodos de negocio utilicen:

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 debería 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.


  • Las instancias de EntityManagerFactory son objetos pesados. Cada fábrica puede mantener un caché de metadatos, un caché de estado del objeto, un grupo EntityManager, un grupo de conexiones y más. Si su aplicación ya no necesita una EntityManagerFactory, debe cerrarla para liberar estos recursos.

  • Cuando se cierra una EntityManagerFactory, todos los gestores de entidades de esa fábrica y, por extensión, todas las entidades administradas por esos gestores de entidades, dejan de ser válidos.

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

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

  • Solo se permite crear una EntityManagerFactory para cada configuración de unidad de persistencia implementada. Se puede crear cualquier cantidad de instancias de EntityManager desde una fábrica determinada.

  • Es posible que haya más de una instancia de fábrica de administrador de entidades disponible simultáneamente en la JVM. Los métodos de la interfaz EntityManagerFactory son seguros para el hilo.