2009-02-25 11 views
8

Ho una raccolta di stati, che voglio memorizzare nella cache per la vita dell'applicazione, preferibilmente dopo che è stata chiamata per la prima volta. Sto usando EclipseLink come provider di persistenza. Nel mio soggetto EJB3 Ho il seguente codice:Come configurare il Cache query in 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) 
      } 
    ) 
}) 

Questo non sembra di fare nulla, però, se a monitorare le query SQL che vanno a MySQL ancora fa un selezionare ogni volta il mio Bean sessione utilizza questa NamedQuery.

Qual è il modo corretto di configurare questa query in modo che venga sempre letta una sola volta dal database, preferibilmente su tutte le sessioni?

Edit: Sto chiamando la query come questa:

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

Buona fortuna a capire la configurazione sessione/cache di EclipseLink. Non ho mai potuto – cletus

risposta

0

Solo una supposizione qui, ma si potrebbe provare

query.cacheQueryResults(); 

dopo averlo creato, ma prima di getResultList.

- MarkusQ

+0

Puoi approfondire come funzionerebbe? L'oggetto Query JPA non supporta il metodo cacheQueryResults(). Se invece creo un oggetto ReadObjectQuery, non so come (o se posso) chiedergli un elenco? – rustyshelf

+0

Se non si desidera utilizzare la query specifica eclipselink, è necessario utilizzare i suggerimenti. Può essere fatto tramite annotazioni, come spiegato da Andre o tramite query.setHint (QueryHints.QUERY_RESULTS_CACHE, HintValues.TRUE) – Pau

0

ho ottenuto EclipseLink 1.0.1 cache per lavorare con l'aggiunta di solo l'hint per la query:

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

non ho cambiato l'entità a tutti, e non ho ancora provato per configurare la cache usando le annotazioni.

8

Le soluzioni pubblicate qui non hanno funzionato per me. Ma l'ho fatto funzionare con:

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

Esattamente, QueryHints.CACHE_USAGE è destinato all'uso della cache di secondo livello. Se vuoi la cache delle query, il suggerimento che devi utilizzare è, come ha detto Andre: QueryHints.QUERY_RESULTS_CACHE – Pau

+0

L'annotazione '@ Cache' non è richiesta perché la query funzioni con la cache – Atais

Problemi correlati