Ehcache HIbernate令人困惑的行为

时间:2015-07-30 14:53:01

标签: java hibernate ehcache

我已经为一个简单的hibernate实体实现了ehcache,如下所示:

1

然后在我的实体课上我有

  @Bean(destroyMethod="shutdown")
  public net.sf.ehcache.CacheManager ehCacheManager() 
  {
    //default config
    CacheConfiguration cacheConfiguration = new CacheConfiguration();
    cacheConfiguration.setName("myCacheName");
    cacheConfiguration.setMemoryStoreEvictionPolicy("LRU");
    cacheConfiguration.setMaxEntriesLocalHeap(1000000);
    //cacheConfiguration.setOverflowToDisk(true);
    cacheConfiguration.setEternal(false);
    cacheConfiguration.setMaxEntriesLocalDisk(1000000);
    cacheConfiguration.setTimeToLiveSeconds(3600);
    cacheConfiguration.setStatistics(true);
    cacheConfiguration.addPersistence(new PersistenceConfiguration().strategy(Strategy.LOCALTEMPSWAP));

    net.sf.ehcache.config.Configuration config = new net.sf.ehcache.config.Configuration();
    config.addDefaultCache(cacheConfiguration);
    config.addDiskStore(new DiskStoreConfiguration().path("C:/myDiskStore"));

    //dynamic scenario cache
    net.sf.ehcache.Cache dynamicScenarioCache = new net.sf.ehcache.Cache(cacheConfiguration);
    dynamicScenarioCache.setName("dynamicScenario");

    //Ehcache manager
    net.sf.ehcache.CacheManager manager = net.sf.ehcache.CacheManager.create(config);
    manager.addCache(dynamicScenarioCache);
    //monitor stats
    MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
    ManagementService.registerMBeans(manager, mBeanServer, false, false, false, true);
      return manager;
   }

我执行以获取数据的查询是:

@Cache(usage = CacheConcurrencyStrategy.READ_WRITE, region = "dynamicScenario")
@Entity
@Table(name="DynamicScenarioTable")
@JsonIgnoreProperties({/** to be specified */})
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE, region = "dynamicScenario")
public class DynamicScenario implements java.io.Serializable
  .....

一切正常,因为在jConsole中我可以看到内存命中和未命中的数量。但是,让我担心的一件事是,当我从数据库中手动输入表中的新条目时,然后在ehcache中自动更新条目数,尽管我将setTimeInterval设置为3600秒,在我看来这意味着是否有任何数据更新 NOT FROM HIBERNATE ,但外部就像我这样做,然后hibernate不会知道它并调用db直到3600秒到期并清除缓存。所以hibernate不会知道db中有一些变化,因为我还没有通过hibernate插入数据。除此之外,困扰我的是我仍然可以在控制台中看到hibernate执行select语句来获取数据,即使我在jConsole中可以看到这些注册为inMemoryHits而不是db选择?任何想法赞赏

1 个答案:

答案 0 :(得分:0)

当数据在Hibernate之外更新时,缓存无法知道,因此您只能依赖过期的数据。

您可能会在项目过期时看到这些选择,或者因为某些其他并发事务已更改实体,因此cache entries got invalidated