2009-02-25 71 views
8

我有一個狀態的集合,我想緩存這個應用程序的生命週期,最好是在第一次調用它之後。我使用EclipseLink作爲我的持久性提供者。在我的EJB3實體我有以下代碼:如何在EclipseLink中配置查詢緩存

@Cache 
@NamedQueries({ 
    @NamedQuery(
     name = "State.findAll", 
     query = "SELECT s FROM State s", 
     hints = { 
       @QueryHint(name=QueryHints.CACHE_USAGE, value=CacheUsage.CheckCacheThenDatabase), 
       @QueryHint(name=QueryHints.READ_ONLY, value=HintValues.TRUE) 
      } 
    ) 
}) 

這似乎並不儘管做任何事情,如果我監控的SQL查詢將MySQL的一個選擇我的每個會話Bean使用此NamedQuery時候它仍然沒有。

什麼是正確的方式來配置此查詢,以便它只能從數據庫中讀取一次,最好跨所有會話?

編輯:這裏

Query query = em.createNamedQuery("State.findAll"); 
List<State> states = query.getResultList(); 
+0

運氣好的搞清楚EclipseLink的會話/緩存配置。我永遠不會。 – cletus 2009-02-25 04:59:01

回答

0

只是一個猜測,但你可以嘗試

query.cacheQueryResults(); 

創建後,但你getResultList前:我是這樣的查詢。

- MarkusQ

+0

你能否詳細說明這將如何工作? JPA查詢對象不支持cacheQueryResults()方法。如果我改爲創建一個ReadObjectQuery,我不知道如何(或者如果我可以)請求它的列表? – rustyshelf 2009-02-25 05:59:27

+0

如果您不想使用eclipselink特定查詢,則必須使用提示。它可以通過註釋來完成,就像Andre解釋的那樣,或者通過query.setHint(QueryHints.QUERY_RESULTS_CACHE,HintValues.TRUE) – Pau 2010-10-29 13:12:40

0

我的EclipseLink 1.0.1緩存只需添加查詢提示工作:

Query query = em.createNamedQuery("Person.find"); 
query.setParameter("NAME", name);  
query.setHint("eclipselink.cache-usage", "CheckCacheThenDatabase"); 
return (Person)query.getSingleResult(); 

我並沒有改變實體可言,而且還沒有嘗試過使用註釋配置緩存。

8

這裏發佈的解決方案不適合我。但我已經使它工作:

@Cache 
@NamedQueries({@NamedQuery(
     name = "State.findAll", 
     query = "SELECT s FROM State s", 
     hints = { 
      @QueryHint(name = QueryHints.QUERY_RESULTS_CACHE, value = HintValues.TRUE) 
     } 
    )})