簡體   English   中英

應該何時創建/打開EntityManagerFactory實例?

[英]When should EntityManagerFactory instance be created/opened?

好的,我閱讀了一些文章/示例如何在單例中編寫實體管理器工廠。

其中一個對我來說最容易理解:

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

我了解到EntityManagerFactory(EMF)應該只在應用程序范圍內創建一次。

並確保在使用后關閉EMF(?)

所以我編寫了EMF helper類來使用的業務方法:

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必須單身如此糟糕? 我讀到了並發問題,但由於我沒有經驗豐富的多線程語法,我真的不清楚這個想法。

  • EntityManagerFactory實例是重量級對象。 每個工廠可能都維護元數據緩存,對象狀態緩存,EntityManager池,連接池等。 如果您的應用程序不再需要EntityManagerFactory,則應關閉它以釋放這些資源。

  • 當EntityManagerFactory關閉時,來自該工廠的所有EntityManagers以及由這些EntityManagers管理的所有實體都將變為無效。

  • 保持工廠長期開放比反復創建和關閉新工廠要好得多。 因此,大多數應用程序永遠不會關閉工廠,或者只在應用程序退出時關閉它。

  • 只有需要具有不同配置的多個工廠的應用程序才有明顯的理由來創建和關閉多個EntityManagerFactory實例。

  • 只允許為每個部署的持久性單元配置創建一個EntityManagerFactory。 可以從給定工廠創建任意數量的EntityManager實例。

  • JVM中可以同時提供多個實體管理器工廠實例。 EntityManagerFactory接口的方法是線程安全的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM