2015-11-11 36 views
0

我在清除緩存時遇到問題。Eclipselink:使用ReadAllQuery時清除緩存

我有一個簡單的ReadAllQuery。

Session session = ((EntityManagerImpl) em).getActiveSession(); 

    ReadAllQuery query = new ReadAllQuery(Customer.class); 
    query.setFetchSize(100); 

    query.useScrollableCursor(); 

    ScrollableCursor cursor = (ScrollableCursor) session.executeQuery(query); 


    int count = 0; 
    while (cursor.hasNext()) { 
     Customer customer = (Customer) cursor.next(); 
     if (++count > 0 && count % 100 == 0) { 
      System.out.println("Fetched " + count + " entities"); 
      em.getEntityManagerFactory().getCache().evictAll(); 
     } 
    } 

我也是在persistence.xml使用em.clear()

 <property name="eclipselink.cache.shared.default" value="false"/> 
     <property name="eclipselink.query-results-cache" value="false"/> 

嘗試,但在堆空間不斷擴大。 如何清除實體?

謝謝

+0

首先,您需要確定什麼是持有內存,這可以通過內存分析工具來完成。它可能是驅動程序本身,在這種情況下使用分頁可能是更好的選擇。 – Chris

回答

0

只要使用此:

em.createNamedQuery("findAll").setHint(QueryHints.CACHE_RETRIEVE_MODE, CacheRetrieveMode.BYPASS).getResultList(); 

正如你可以在BYPASS枚舉的javadoc中看到:

繞過緩存:直接從數據庫中獲取數據。