8

我有一组状态,我想在应用程序的生命周期内缓存它们,最好是在第一次调用它之后。我使用 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)
            }
    )
})

不过,这似乎没有任何作用,如果我监控到 MySQL 的 SQL 查询,它仍然会在每次我的会话 Bean 使用这个 NamedQuery 时进行选择。

配置此查询的正确方法是什么,以便它只从数据库中读取一次,最好是在所有会话中读取?

编辑:我这样调用查询:

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

3 回答 3

9

此处发布的解决方案对我不起作用。但我已经使它与:

@Cache
@NamedQueries({@NamedQuery(
      name = "State.findAll",
      query = "SELECT s FROM State s", 
      hints = {
          @QueryHint(name = QueryHints.QUERY_RESULTS_CACHE, value = HintValues.TRUE)
      }
    )})
于 2010-07-26T15:01:05.260 回答
0

这里只是一个猜测,但你可以试试

query.cacheQueryResults();

在您创建它之后但在您之前getResultList

——马库斯

于 2009-02-25T05:41:38.697 回答
0

通过添加查询提示,我得到了 EclipseLink 1.0.1 缓存:

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

我根本没有更改实体,也没有尝试使用注释配置缓存。

于 2009-03-23T09:24:40.907 回答