Как настроить кэширование запросов в EclipseLink - PullRequest
8 голосов
/ 25 февраля 2009

У меня есть набор состояний, которые я хочу кэшировать на весь срок службы приложения, желательно после его первого вызова. Я использую EclipseLink в качестве поставщика сохраняемости. В моей сущности EJB3 у меня есть следующий код:

@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, он все равно делает выбор каждый раз, когда мой Session Bean использует этот NamedQuery.

Как правильно настроить этот запрос, чтобы он когда-либо считывался из базы данных только один раз, предпочтительно во всех сеансах?

Редактировать: я вызываю запрос следующим образом:

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

Ответы [ 3 ]

8 голосов
/ 26 июля 2010

Решения, размещенные здесь, не работают для меня. Но я заставил его работать с:

@Cache
@NamedQueries({@NamedQuery(
      name = "State.findAll",
      query = "SELECT s FROM State s", 
      hints = {
          @QueryHint(name = QueryHints.QUERY_RESULTS_CACHE, value = HintValues.TRUE)
      }
    )})
0 голосов
/ 23 марта 2009

Я получил кэш EclipseLink 1.0.1 для работы, добавив только подсказку запроса:

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

Я вообще не менял сущность и еще не пытался настроить кэш с использованием аннотаций.

0 голосов
/ 25 февраля 2009

Просто угадайте здесь, но вы можете попробовать

query.cacheQueryResults();

после создания, но перед вами getResultList.

- MarkusQ

...