Java Spring缓存-如何管理不同范围内的缓存?

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

我正在使用Spring缓存抽象开发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。所以我得到了所有会话的缓存结果

您只能在会话中存储可序列化bean。当然,只要只有一个应用程序节点,就可以通过对象引用来存储所有内容。但是,重新启动后它将不可用


如果要缓存属于会话的数据,请使用复合键(会话id,您的键)定义一个全局缓存。

能否添加有关在何处使用这些缓存和缓存管理器的信息?我相信你的CompositeCacheManager给你带来了麻烦。我在我的服务方法中使用了
@Cacheable(“sessionCache”)
@Cacheable(“globalCache”)
。CompositeCacheManager就像一个魔咒,它能够处理多个缓存管理器…序列化会话缓存不是我的目标。。。我希望有几个不同用途的缓存。因为缓存配置变化很大!e、 永恒的,不是永恒的