对于两个连续的相同查询,hibernate二级缓存命中= 0

时间:2014-09-22 09:32:54

标签: java spring hibernate caching ehcache

在我的Spring + Hibernate项目中为hibernate设置二级缓存时出了问题,或者我不明白它是如何工作的。

我有一个大致定义为此表的表

@Entity
@Cache(usage=CacheConcurrencyStrategy.READ_ONLY, region="testCache")
public class TestClass extends MSId {
     @Transient
     STATUS statut = STATUS.NORMAL;
     public FamilleCatalogue(int id) {
          this.id = id;
     }
}

在我的配置中,我有这个:

        <property name="hibernate.hbm2ddl.auto" value="update" />
        <property name="hibernate.default_schema" value="dbtest" />
        <property name="hibernate.cache.use_query_cache" value="false" />
        <property name="hibernate.cache.use_second_level_cache" value="true" />
        <property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.ehcache.EhCacheRegionFactory" />
        <property name="hibernate.generate_statistics" value="true" />
        <property name="hibernate.cache.generate_statistics" value="true" />
        <property name="hibernate.cache.use_structured_entries" value="false" />
        <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
        <property name="hibernate.show_sql" value="false" />
        <property name="hibernate.format_sql" value="false" />
        <property name="hibernate.use_sql_comments" value="false" />
        <property name="net.sf.ehcache.configurationResourceName" value="/spring/persistence/single/hibernate/ehcache.xml"/>
        <property name="hibernate.cache.use_reference_entries" value="true"/>

我的ehcache.xml包含:

<cache
    name="testCache"
    eternal="false"
    timeToIdleSeconds="3600"
    timeToLiveSeconds="3600"
    statistics="true"
    logging="true"
    maxElementsInMemory="100">
</cache>

现在,在我的测试中,我使用以下方法查询测试类的所有元素:

Query q = this.getEntityManager().createQuery("FROM " + entityClass.getSimpleName());
List<E> result = q.getResultList();
return result;

问题是我查询了2次,他们期望第二次生成的对象将从第二级缓存而不是数据库中的直接查询。但是,每次启动查询时,都会从数据库中检索所有实体并将其放入缓存中,如下面的跟踪所示:

======> Query all test objects (1)
      --> Entity Load Count                : 297
      --> 2nd Level Hits                   : 1
      --> 2nd Level Misses                 : 1
      --> 2nd Level Puts                   : 296
======> Query all test objects (2)
      --> Entity Load Count                : 593
      --> 2nd Level Hits                   : 1
      --> 2nd Level Misses                 : 1
      --> 2nd Level Puts                   : 592
  • 任何人都可以解释一下吗?
  • 如果对象已经存在于缓存中,为什么放置的数量会增加?
  • 是否因为只有在按ID查询时才使用二级缓存?
  • 这是否与我应该启用的QueryCache有关?因为当我启用它时,从查询缓存中检索数据要慢于实际查询数据库...

精确度:hit = 1是我在特定对象上启动的Id的查询结果。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

查询级缓存

这是一个可选功能,需要两个额外的物理缓存区域来保存缓存的查询结果和上次更新表时的时间戳。这仅适用于使用相同参数频繁运行的查询。

Query q = this.getEntityManager().createQuery("FROM " + entityClass.getSimpleName());
query.setCacheable(true);
List<E> result = q.getResultList();
return result;

有关查询缓存here

的更多信息