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

标签 java spring caching scope ehcache

我正在使用 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/

相关文章:

java - 如何将不同的记录器记录到不同的文件中

java - 如何只显示jtree中的文件夹

java - 在对一个列表的元素进行排序后检查两个列表的顺序是否相等

java - java中的请求转发

android - 如何使用 Volley 从缓存中删除图像?

java - JCS 缓存 - 删除功能不删除特定元素

java - 交换数组列表的内容

java - 错误 404 : Issue accessing/WEB-INF/views/sendMessage.原因:未找到

java - 使用 JPA 和 Spring 批量插入

c# - .NET 7 创建自定义输出缓存策略