Подтвердить что ты не робот

Когда должен быть создан/открыт экземпляр EntityManagerFactory?

Хорошо, я прочитал кучу статей/примеров, как написать Entity Manager Factory в singleton.

Один из них для меня легче всего понять:

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

Я узнал, что EntityManagerFactory (EMF) следует создавать только один раз, предпочтительно в области приложения.

И также обязательно закройте EMF, как только он (?)

Итак, я написал класс помощника EMF для использования бизнес-методов:

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

И мой метод с использованием 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();
    }

Я обязательно запустил EntityManager (em) на уровне метода, как было предложено. Но , когда должен быть закрыт EntityManagerFactory, тогда? И почему EMF должен быть настолько сильным? Я читал о проблемах concurrency, но поскольку я не опытный многопоточный грамматик, я не могу быть предельно ясным в этой идее.

4b9b3361

Ответ 1

  • Объекты EntityManagerFactory: тяжеловесные предметы. Каждый factory может поддерживать кеш метаданных, кеш состояния объекта, EntityManager пул, пул соединений и т.д. Если ваше приложение больше не нуждается в EntityManagerFactory, вы должны закройте его, чтобы освободить эти ресурсы.

  • Когда EntityManagerFactory закрывается, все EntityManagers из этого factory, и, кроме того, все этими EntityManager, становятся недействителен.

  • Гораздо лучше сохранить factory открытые в течение длительного периода времени, чем неоднократно создавать и закрывать новые заводы. Таким образом, большинство приложений никогда не закроет factory или только закройте его, когда приложение выход.

  • Только приложения, требующие несколько заводов с разными конфигурации имеют очевидную причину для создания и закрытия нескольких EntityManagerFactory экземпляры.

  • Только один EntityManagerFactory разрешено создавать для каждого развернутый блок персистентности конфигурации. Любое количество Экземпляры EntityManager могут быть созданный из заданного factory.

  • Более одного менеджера объектов factory экземпляр может быть доступен одновременно в JVM. Методы EntityManagerFactory интерфейс являются потокобезопасными.