2009-02-25 13 views
8

Mam kolekcję stanów, które chcę buforować przez całe życie aplikacji, najlepiej po jej wywołaniu po raz pierwszy. Używam EclipseLink jako mojego dostawcy trwałości. W moim podmiot EJB3 mam następujący kod:Jak skonfigurować buforowanie kwerend w 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) 
      } 
    ) 
}) 

nie wydają się nic zrobić chociaż, jeśli monitorowanie zapytań SQL udających się do MySQL to nadal robi select każdym razem mój Bean Session używa tego NamedQuery.

Jaki jest prawidłowy sposób skonfigurowania tego zapytania, aby był zawsze odczytywany tylko raz z bazy danych, najlepiej we wszystkich sesjach?

Edit: Wołam kwerendę tak:

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

Powodzenia w określaniu konfiguracji sesji/buforowania EclipseLink. Nigdy nie mogłem. – cletus

Odpowiedz

0

tylko przypuszczenie tutaj, ale można spróbować

query.cacheQueryResults(); 

po jej utworzeniu, ale przed wami getResultList.

- MarkusQ

+0

Czy możesz wyjaśnić, jak to zadziała? Obiekt zapytania JPA nie obsługuje metody cacheQueryResults(). Jeśli zamiast tego utworzę obiekt ReadObjectQuery, nie wiem jak (lub jeśli mogę) poprosić o listę? – rustyshelf

+0

Jeśli nie chcesz korzystać z kwerendy eclipselink especific, musisz użyć wskazówek. Można to zrobić za pomocą adnotacji, jak wyjaśnił Andre lub poprzez query.setHint (QueryHints.QUERY_RESULTS_CACHE, HintValues.TRUE) – Pau

0

mam EclipseLink 1.0.1 cache do pracy poprzez dodanie tylko podpowiedź zapytanie:

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

nie miałem w ogóle zmienić jednostkę, a jeszcze nie próbowałem skonfigurować pamięć podręczną przy użyciu adnotacji.

8

Rozwiązania tutaj opublikowane nie działają dla mnie. Ale udało mi się z nim pracować:

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

Dokładnie, QueryHints.CACHE_USAGE służy do korzystania z pamięci podręcznej drugiego poziomu. Jeśli chcesz mieć pamięć podręczną zapytań, wskazówką, której musisz użyć, jest, jak powiedział Andre: QueryHints.QUERY_RESULTS_CACHE – Pau

+0

Adnotacja '@ Cache' nie jest wymagana, aby zapytanie działało z pamięcią podręczną – Atais