我正在使用Spring Caching Abstraction开发Spring MVC应用程序。缓存实现是版本2.6.5中的EhCache
现在我需要两个缓存 - 一个应用程序作用域和另一个作用域,因为某些方法结果基于Web会话。实现这一目标的最佳方法是什么?
我认为我无法在与全局缓存相同的CacheManager中注册会话缓存,因为当spring尝试注入CacheManager时可能没有可用的会话。因此,我有另一个会话范围的CacheManager ...
@Bean
public net.sf.ehcache.Cache sessionCache() {
return new net.sf.ehcache.Cache(sessionCacheConfiguration());
}
@Bean
@Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS)
public CacheManager sessionCacheManager(){
net.sf.ehcache.CacheManager sessionCacheManager = net.sf.ehcache.CacheManager.create();
sessionCacheManager.setName("sessionCacheManager");
sessionCacheManager.addCache(sessionCache());
return new EhCacheCacheManager(sessionCacheManager);
}
@Bean
public CacheManager globalCacheManager() {
return new EhCacheCacheManager(ehCacheCacheManager().getObject());
}
@Bean
public EhCacheManagerFactoryBean ehCacheCacheManager() {
EhCacheManagerFactoryBean cmfb = new EhCacheManagerFactoryBean();
cmfb.setConfigLocation(new ClassPathResource("ehcache.xml"));
cmfb.setShared(true);
return cmfb;
}
@Bean
public CompositeCacheManager cacheManager(){
return new CompositeCacheManager(globalCacheManager(), sessionCacheManager()){{
setFallbackToNoOpCache(true);
}};
}
不幸的是,这不能正常工作,spring只创建一次sessionCacheManager。所以我得到了所有会话的缓存结果。
答案 0 :(得分:1)
您只能在会话中存储可序列化的bean。当然,只要您只有一个应用程序节点,就可以通过对象引用在技术上存储所有内容。但是,重启后它将无法使用。
如果要缓存属于会话的数据,请使用复合键(session-id,you-key)定义全局缓存。