【问题标题】:Ehcache HIbernate confusing behaviourEhcache HIbernate 令人困惑的行为
【发布时间】:2015-10-22 00:12:00
【问题描述】:

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

  @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
  .....

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

 getSession().createQuery("from DynamicScenario").list();

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

【问题讨论】:

    标签: java hibernate ehcache


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多