如何在EclipseLink中配置查询缓存

时间:2009-02-25 04:53:52

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

我有一组状态,我希望在应用程序的生命周期中缓存,最好是在第一次调用它之后。我正在使用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();

3 个答案:

答案 0 :(得分:8)

答案 1 :(得分:0)

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

query.cacheQueryResults();

创建之后但在getResultList之前。

- MarkusQ

答案 2 :(得分: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();

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