当前位置: 代码迷 >> java >> Ehcache HIbernate令人困惑的行为
  详细解决方案

Ehcache HIbernate令人困惑的行为

热度:125   发布时间:2023-07-18 09:01:48.0

我已经为一个简单的休眠实体实现了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中,我可以看到内存命中和未命中的次数。 但是,让我担心的一件事是,当我从数据库中手动在表中输入新条目时,条目数会在ehcache中自动更新,尽管我将setTimeInterval设置为3600秒,在我看来这意味着是否有任何数据是不是从HIBERNATE更新的,但是外部像我一样进行更新,然后Hibernate不会知道它,并且直到3600秒到期并清除缓存后才对数据库进行调用。 因此,由于我尚未通过hibernate插入数据,因此hibernate不会知道db中有一些更改。 除此之外,令我困扰的是,即使我在jConsole中看到这些已注册为inMemoryHits而不是db select,我仍然可以在控制台中看到休眠的hibernate执行select语句来获取数据? 任何想法表示赞赏

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

您可能会在项目过期时或由于其他并发事务更改了实体而看到了这些选择,从而使 。

  相关解决方案