2014-06-13 50 views
2

我正在開發一個使用Eclipse IDE,EclipseLink,JPA和MySQL的應用程序。在應用程序的首次發佈期間,我需要刪除表格的內容。但是,在刪除應用程序後,建立新的連接仍會從空表讀取舊數據。 我最初的做法是每次執行操作時創建一個new EntityManagerJPA緩存未失效

private EntityManager entityManager; 

    public FacadeFactory() { 
     entityManager = DBConnection.connect(); 
    } 

禁用JPA緩存後,問題就解決了。

由於性能問題,EntityManager已更改爲Singleton,以便只打開一個到數據庫的連接。

private static FacadeFactory instance; 
    private EntityManager entityManager; 

    private FacadeFactory() { 
     entityManager = DBConnection.connect(); 
    } 

    public static FacadeFactory getInstance(){ 
     if(instance == null){ 
      instance = new FacadeFactory(); 
     } 
     return instance; 
    } 

現在,即使緩存仍然被禁用,我仍然遇到與以前相同的問題。我試圖從persistence.xml和代碼中禁用緩存,但它們都不適用於我。

<property name="eclipselink.cache.shared.default" value="false"/> 
entityManager.getEntityManagerFactory().getCache().evictAll(); 

任何人都可以幫我嗎?

+0

什麼樣的性能問題在使用新的EntityManager時有什麼要求?它們應該是輕量級的,我能看到的唯一的主要好處應該是你想禁用的附加緩存 – Chris

+0

@克里斯,我注意到了d每次創建新的EntityManagers時,程序運行速度會稍微慢一些。 – sebi

回答

0

entityManager.getEntityManagerFactory()。getCache()。evictAll();正在清除共享緩存,而eclipselink.cache.shared.default「value =」false「也會影響共享緩存。共享緩存也稱爲二級緩存 - 第一個緩存是在EntityManager自身內部使用的緩存因爲你正在使用一個EntityManager來處理所有事情,所有的東西都放在第一級緩存中

你可以根據需要創建一個新的EntityManager,或者你可以偶爾調用em.clear()清除緩存在EntityManager中 - 分離你的實體

+0

謝謝@Chris!我每次調用find()或findAll()時都會調用em.refresh(entity)來解決問題。你認爲哪一個(刷新或清除)更好? – sebi

+0

我會改爲劃定您的EntityManager,以便您可以偶爾調用清除來釋放資源。對每個查找或查詢調用清除或刷新可能會導致性能問題,但這一切取決於您如何使用該應用程序。 – Chris