Hibernate二级缓存:无法驱逐

时间:2018-04-18 20:56:24

标签: hibernate ehcache-2

我使用Hibernate 4.1.7和EhCache作为二级缓存。我正在实施一项休息服务,以便根据需要清除cahce(驱逐所有地区)。

以下是代码段

org.hibernate.stat.Statistics statistics = HibernateUtil.getSessionFactory().getStatistics();
      statistics.setStatisticsEnabled(true);

      long hits = statistics.getSecondLevelCacheHitCount();
      long misses = statistics.getSecondLevelCacheMissCount();
      long puts = statistics.getSecondLevelCachePutCount();

      logger.info("Hits: " + hits + " Misses: " + misses +  " Puts:" + puts);


      cache.evictEntityRegions();

      hits = statistics.getSecondLevelCacheHitCount();
      misses = statistics.getSecondLevelCacheMissCount();
      puts = statistics.getSecondLevelCachePutCount();


      logger.info("Hits: " + hits + " Misses: " + misses +  " Puts:" + puts);         

      long hit0 = statistics.getQueryCacheHitCount();
      long miss0 = statistics.getSecondLevelCacheMissCount();

不幸的是,在我驱逐所有区域之后,我得到了相同的命中/未命中值。

1 个答案:

答案 0 :(得分:2)

这些计数具有以下含义:

  • Hits - Hibernate检查对象的缓存并找到该对象的次数,即已经在缓存中
  • 未命中 - Hibernate检查对象的缓存但在缓存中找不到该对象的次数(因此需要从数据库中提取)
  • Puts - Hibernate将对象放入缓存的次数

这些统计信息不会为您提供缓存中的当前项目数。考虑到这一点,清除缓存不会影响这些数字。

如果您执行想要重置统计信息,请使用

statistics.clear()

但是如果你想检查缓存的实际大小,你可以使用

CacheManager.ALL_CACHE_MANAGERS.get(0).getCache("com.example.MyEntity").getSize();

请注意,每个实体都有自己的缓存,使用实体的完全限定类名命名。