在缓存中找不到查询结果

时间:2010-07-23 04:43:21

标签: hibernate orm jpa caching ehcache

环境:JBoss 5.1,ehcache 2.1.0,hibernate 3.3.x,seam 2.2.0

ehcache.xml(2.1.0版)包含以下行,但在缓存中找不到我的查询结果。我应该为每个被触发的查询设置一个缓存区域。我在这里缺少什么?

<!-- Cache configuration -->
<cache name="org.hibernate.cache.UpdateTimestampsCache"
    maxElementsInMemory="5000" eternal="true" timeToIdleSeconds="300"
    timeToLiveSeconds="300" overflowToDisk="true" diskPersistent="false"
    diskExpiryThreadIntervalSeconds="300" memoryStoreEvictionPolicy="LRU" />

<cache name="org.hibernate.cache.StandardQueryCache"
    maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="300"
    timeToLiveSeconds="300" overflowToDisk="true" diskPersistent="false"
    diskExpiryThreadIntervalSeconds="300" memoryStoreEvictionPolicy="LRU" />

1 个答案:

答案 0 :(得分:4)

  

我是否应该为每个被触发的查询设置缓存区域。我在这里缺少什么?

不,你不是(除非你想对它们进行细粒度的控制)。以下是文档对该主题的评论:

  

19.4. The Query Cache

     

也可以缓存查询结果集。   这仅适用于查询   经常运行相同的   参数。你首先需要   启用查询缓存:

hibernate.cache.use_query_cache true
     

此设置会创建两个新缓存   regions:一个持有缓存查询   结果集   (org.hibernate.cache.StandardQueryCache),   另一个持有时间戳的   最新的可查询更新   表   (org.hibernate.cache.UpdateTimestampsCache)。   请注意,查询缓存不会   缓存实际实体的状态   在结果集中;它只缓存   标识符值和值的结果   类型。查询缓存应该始终   与...一起使用   二级缓存

     

大多数查询都没有从中受益   缓存,所以默认情况下,查询是   没有缓存。要启用缓存,请致电   Query.setCacheable(true)。这个电话   允许查询查找现有查询   缓存结果或将结果添加到   执行时的缓存。

     

如果您需要细粒度控制   查询缓存过期策略,   您可以指定命名的缓存区域   通过调用来查询特定查询   Query.setCacheRegion()

List blogs = sess.createQuery("from Blog blog where blog.blogger = :blogger")
    .setEntity("blogger", blogger)
    .setMaxResults(15)
    .setCacheable(true)
    .setCacheRegion("frontpages")
    .list();
     

如果查询应该强制刷新   它应该是它的查询缓存区域   呼叫   Query.setCacheMode(CacheMode.REFRESH)。   这在案例中特别有用   可能存在基础数据的地方   通过单独的过程更新(即,   没有通过Hibernate修改)和   允许应用程序有选择地   刷新特定的查询结果集。   这是一种更有效的替代方案   驱逐查询缓存区域   通过SessionFactory.evictQueries()

现在,问题是:

  • 你启用了二级缓存吗?
  • 您是否启用了查询所针对的实体的缓存?
  • 您是否通过调用setCacheable(true)
  • 实际启用了查询缓存

这是不相关的,但我还建议激活org.hibernate.cache类别的记录。

另见