2009-02-25 11 views
8

J'ai une collection d'états, que je veux mettre en cache pour la durée de vie de l'application, de préférence après qu'elle a été appelée pour la première fois. J'utilise EclipseLink comme fournisseur de persistance. Dans mon entité EJB3 Je le code suivant:Comment configurer la mise en cache des requêtes dans 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) 
      } 
    ) 
}) 

Cela ne ne semble pas faire quoi que ce soit que, si je surveille les requêtes SQL va le MySQL encore sélectionnez chaque fois que ma session Bean utilise NamedQuery.

Quelle est la bonne façon de configurer cette requête afin qu'elle ne soit jamais lue qu'une seule fois dans la base de données, de préférence sur toutes les sessions?

Edit: J'appelle la requête comme ceci:

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

Bonne chance pour trouver la configuration de session/mise en cache d'EclipseLink. Je ne pourrais jamais. – cletus

Répondre

0

Juste une supposition, mais vous pouvez essayer

query.cacheQueryResults(); 

après l'avoir créé, mais avant getResultList.

- MarkusQ

+0

Pouvez-vous expliquer comment cela fonctionnerait? L'objet JPA Query ne prend pas en charge la méthode cacheQueryResults(). Si je crée à la place un ReadObjectQuery je ne sais pas comment (ou si je peux) lui demander une liste? – rustyshelf

+0

Si vous ne voulez pas utiliser la requête eclipselink especific, vous devez utiliser des astuces. Cela peut être fait par des annotations, comme l'a expliqué André ou via query.setHint (QueryHints.QUERY_RESULTS_CACHE, HintValues.TRUE) – Pau

0

Je suis cache EclipseLink 1.0.1 travailler en ajoutant simplement l'indicateur de requête:

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

je ne change pas l'entité du tout, et n'ont pas encore essayé configurer le cache en utilisant des annotations.

8

Les solutions affichées ici n'ont pas fonctionné pour moi. Mais je l'ai fait fonctionner avec:

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

Exactement, QueryHints.CACHE_USAGE est pour l'utilisation du cache de second niveau. Si vous voulez un cache de requête, l'indice que vous devez utiliser est, comme André l'a dit: QueryHints.QUERY_RESULTS_CACHE – Pau

+0

L'annotation '@ Cache' n'est pas nécessaire pour que la requête fonctionne avec le cache – Atais

Questions connexes