【问题标题】:Persistent storage with SimpleCacheManager使用 SimpleCacheManager 进行持久存储
【发布时间】:2021-12-17 09:53:05
【问题描述】:

我遇到了一个问题,我的服务上的方法具有如下注释:

@Cacheable(value = "myCache", key = "'myCache' + #listType", unless = "#result.getMyList().size() == 0")

在我的 EhCacheConfig 中,如下所示:

 @Bean
    public CacheManager cacheManager() {
        SimpleCacheManager cacheManager = new SimpleCacheManager();
        List<Cache> caches = new ArrayList<Cache>();
        caches.add(new ConcurrentMapCache("myCache"));
        cacheManager.setCaches(caches);
        return cacheManager;
    }

缓存按我的预期工作,但现在我需要一个持久存储,我只能找到如何使用 PersistentCacheManager 来完成它。当我尝试按照EhCache documentation 实现它时,我不断收到错误消息:

"Cannot find cache named 'myCache' for Builder

这是我在实现 PersistentCacheManager 时的 EhCacheConfig:

@Bean
    public PersistentCacheManager cacheManager() {
        PersistentCacheManager persistentCacheManager = CacheManagerBuilder.newCacheManagerBuilder()
                .with(CacheManagerBuilder.persistence(new File(storagePath, "myData")))
                .withCache("myCache", CacheConfigurationBuilder.newCacheConfigurationBuilder(String.class, NotificationListResponse.class,
                        ResourcePoolsBuilder.newResourcePoolsBuilder()
                                .disk(10, MemoryUnit.MB, true))
                )
                .build();
        persistentCacheManager.init(true);
        return persistentCacheManager;
    }

【问题讨论】:

  • 这个问题可能是由拼写错误引起的吗?您在配置中使用notificationList,而不是myCache
  • 对不起,我把缓存的名字换成了这里添加,漏掉了这个。但它们都与我的代码匹配

标签: java spring-boot ehcache ehcache-3


【解决方案1】:

解决了以下问题:

不需要上面的bean并创建了一个CacheHelper

private String storagePath = "home\\parentFolder\\cache";

private PersistentCacheManager persistentCacheManager;
private Cache<String, String> myCache;

public EhCacheHelper() {
    persistentCacheManager = CacheManagerBuilder.newCacheManagerBuilder()
            .with(CacheManagerBuilder.persistence(new File(storagePath, "myData")))
            .withCache("myCache", CacheConfigurationBuilder.newCacheConfigurationBuilder(String.class, String.class,
                    ResourcePoolsBuilder.newResourcePoolsBuilder()
                            .disk(10, MemoryUnit.MB, true))
            )
            .build(true);
}

public Cache<String, NotificationListResponse> getMyCacheFromCacheManager() {
    return persistentCacheManager.getCache("myCache", String.class, String.class);
}

关于我想要缓存的方法,而不是使用 Cacheable 注释,添加代码来访问和保存数据到缓存,例如:

if (cache.getMyCacheFromCacheManager().containsKey(myKey)) {
    return cache.getMyCacheFromCacheManager().get(myKey);
}
.
.
.
cache.getMyCacheFromCacheManager().put(myKey, myValue);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-22
    • 2020-06-22
    • 2016-09-12
    • 2016-11-22
    • 2012-07-30
    • 1970-01-01
    • 2013-03-22
    • 2015-06-19
    相关资源
    最近更新 更多