【发布时间】: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 选择?任何想法表示赞赏
【问题讨论】: