我正在使用 Spring 缓存抽象开发 Spring MVC 应用程序。缓存实现是2.6.5版本的EhCache
现在我需要两个缓存 - 一个是应用程序范围,另一个是 session 范围,因为某些方法结果基于 Web session 。实现这一目标的最佳方法是什么?
我认为我无法在与全局缓存相同的 CacheManager 中注册 session 缓存,因为当 spring 尝试注入(inject) CacheManager 时可能没有可用的 session 。因此我有另一个 session 范围的 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。所以我得到了所有 session 的缓存结果。
最佳答案
您只能在 session 中存储可序列化的 Bean。当然,只要您只有一个应用程序节点,从技术上讲您就可以通过对象引用来存储所有内容。但重启后将无法使用。
如果您想缓存属于 session 的数据,请使用复合键(session-id、you-key)定义全局缓存。
关于java - Spring Caching - 如何管理不同范围的缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37405342/