环境: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" />
答案 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
类别的记录。