2009-02-25 8 views
8

Ich habe eine Sammlung von Zuständen, die ich für die Lebensdauer der Anwendung zwischenspeichern möchte, vorzugsweise nachdem es zum ersten Mal aufgerufen wird. Ich verwende EclipseLink als meinen Persistenzanbieter. In meiner EJB3 Einheit habe ich den folgenden Code:So konfigurieren Sie Abfragecaching 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) 
      } 
    ) 
}) 

Dies scheint nicht, etwas obwohl zu tun, wenn ich die SQL-Abfragen gehen MySQL Monitor immer noch tut es einer Auswahl jedes Mal meiner Session Bean diese NamedQuery verwendet.

Wie kann diese Abfrage richtig konfiguriert werden, so dass sie nur einmal aus der Datenbank gelesen wird, vorzugsweise über alle Sitzungen hinweg?

Edit: Ich rufe die Abfrage wie folgt aus:

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

Viel Glück herauszufinden, die Sitzung/Caching-Konfiguration von EclipseLink. Ich konnte es nie. – cletus

Antwort

0

Nur hier Vermutung, aber Sie könnten

query.cacheQueryResults(); 

versuchen, nachdem Sie es schaffen, aber bevor Sie getResultList.

- MarkusQ

+0

Können Sie näher erläutern, wie das funktionieren würde? Das JPA-Abfrageobjekt unterstützt die cacheQueryResults() -Methode nicht. Wenn ich stattdessen eine ReadObjectQuery erstelle, weiß ich nicht wie (oder wenn ich kann) nach einer Liste fragen? – rustyshelf

+0

Wenn Sie die Eclipselink-spezifische Abfrage nicht verwenden möchten, müssen Sie Hinweise verwenden. Es kann durch Anmerkungen gemacht werden, wie Andre erklärte oder durch query.setHint (QueryHints.QUERY_RESULTS_CACHE, HintValues.TRUE) – Pau

0

Ich habe Eclipse 1.0.1 Cache nur die Abfrage-Hinweis Hinzufügen zu arbeiten:

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

ich das Unternehmen nicht überhaupt ändern, und haben noch nicht versucht Konfigurieren des Caches mithilfe von Anmerkungen.

8

Die hier veröffentlichten Lösungen funktionierten nicht für mich. Aber ich habe es funktioniert mit:

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

Genau, QueryHints.CACHE_USAGE ist für die Verwendung von Second-Level-Cache. Wenn Sie den Query-Cache verwenden möchten, ist der Hinweis, den Sie verwenden müssen, wie Andre sagte: QueryHints.QUERY_RESULTS_CACHE – Pau

+0

Die @ @ Cache Annotation ist nicht erforderlich, damit die Abfrage mit dem Cache arbeitet – Atais