【问题标题】:How To Configure Query Cacheing in EclipseLink如何在 EclipseLink 中配置查询缓存
【发布时间】:2010-10-09 17:49:52
【问题描述】:

我有一组状态,我想在应用程序的整个生命周期中缓存它们,最好是在它第一次调用之后。我使用 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 查询,它仍然会在每次我的 Session Bean 使用这个 NamedQuery 时进行选择。

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

编辑:我这样调用查询:

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

【问题讨论】:

  • 祝你好运,搞清楚 EclipseLink 的会话/缓存配置。我从来没有。
  • QueryHints.CACHE_USAGECacheUsage.CheckCacheThenDatabase 导致我的列表查询只返回一个条目。与@André Luiz Cardoso 的回答一起正常工作。

标签: java jpa jakarta-ee ejb-3.0 eclipselink


【解决方案1】:

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

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

【讨论】:

  • 没错,QueryHints.CACHE_USAGE是为了二级缓存的使用。如果你想要查询缓存,你必须使用的提示是,正如 Andre 所说:QueryHints.QUERY_RESULTS_CACHE
  • 查询使用缓存不需要@Cache 注释
【解决方案2】:

我通过添加查询提示让 EclipseLink 1.0.1 缓存工作:

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

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

【讨论】:

  • 似乎需要eclipselink.cache-usageCheckCacheThenDatabase 的单一结果。但是对于结果列表,它会导致查询只返回一项。
【解决方案3】:

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

query.cacheQueryResults();

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

-- MarkusQ

【讨论】:

  • 你能详细说明这将如何工作吗? JPA Query 对象不支持 cacheQueryResults() 方法。如果我改为创建一个 ReadObjectQuery,我不知道如何(或者如果我可以)向它索要一个列表?
  • 如果你不想使用 eclipselink 特定的查询,你必须使用提示。它可以通过注释来完成,正如 Andre 解释的那样,或者通过 query.setHint(QueryHints.QUERY_RESULTS_CACHE, HintValues.TRUE)
猜你喜欢
  • 2013-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-07
  • 2014-06-28
  • 1970-01-01
  • 2020-07-22
相关资源
最近更新 更多