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

时间:2016-05-24 05:49:56

标签: java spring caching scope ehcache

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

1 个答案:

答案 0 :(得分:1)

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

如果要缓存属于会话的数据,请使用复合键(session-id,you-key)定义全局缓存。