我已经为一个简单的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选择?任何想法赞赏
答案 0 :(得分:0)
当数据在Hibernate之外更新时,缓存无法知道,因此您只能依赖过期的数据。
您可能会在项目过期时看到这些选择,或者因为某些其他并发事务已更改实体,因此cache entries got invalidated。