Java Spring缓存-如何管理不同范围内的缓存?
我正在使用Spring缓存抽象开发Spring MVC应用程序。缓存实现是版本2.6.5中的EhCache 现在我需要两个缓存—一个应用程序范围,另一个会话范围,因为有些方法结果基于web会话。实现这一目标的最佳方式是什么 我想我不能在与全局缓存相同的CacheManager中注册会话缓存,因为当spring尝试注入CacheManager时,可能没有可用的会话。因此,我有另一个CacheManager,它是会话范围的Java Spring缓存-如何管理不同范围内的缓存?,java,spring,caching,scope,ehcache,Java,Spring,Caching,Scope,Ehcache,我正在使用Spring缓存抽象开发Spring MVC应用程序。缓存实现是版本2.6.5中的EhCache 现在我需要两个缓存—一个应用程序范围,另一个会话范围,因为有些方法结果基于web会话。实现这一目标的最佳方式是什么 我想我不能在与全局缓存相同的CacheManager中注册会话缓存,因为当spring尝试注入CacheManager时,可能没有可用的会话。因此,我有另一个CacheManager,它是会话范围的 @Bean public net.sf.ehcache.Cache sess
@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。所以我得到了所有会话的缓存结果 您只能在会话中存储可序列化bean。当然,只要只有一个应用程序节点,就可以通过对象引用来存储所有内容。但是,重新启动后它将不可用
如果要缓存属于会话的数据,请使用复合键(会话id,您的键)定义一个全局缓存。能否添加有关在何处使用这些缓存和缓存管理器的信息?我相信你的CompositeCacheManager给你带来了麻烦。我在我的服务方法中使用了
@Cacheable(“sessionCache”)
和@Cacheable(“globalCache”)
。CompositeCacheManager就像一个魔咒,它能够处理多个缓存管理器…序列化会话缓存不是我的目标。。。我希望有几个不同用途的缓存。因为缓存配置变化很大!e、 永恒的,不是永恒的