当前位置: 首页 > 知识库问答 >
问题:

除非cachemanager,否则无法从cachemanager获取缓存。调用getCacheNames()

柳宾实
2023-03-14

我的应用程序使用Spring 4.3. x、EhCache 3.6和javax Cache 1.1.0。以下是我在应用程序中配置javax CacheManager的方式:

    <bean id="jCacheManager" class="org.springframework.cache.jcache.JCacheCacheManager">
        <property name="cacheManager" ref="appCacheManagerFactoryBean" />
    </bean>

    <bean id="appCacheManagerFactoryBean" class="com.example.AppCacheManagerFactoryBean"/>

AppCacheManagerFactoryBean(只是JCacheManagerFactoryBean的自定义版本)帮助我为我的应用程序配置全局持久性目录。这是它的外观:

public class AppCacheManagerFactoryBean implements FactoryBean<CacheManager>, InitializingBean,
    DisposableBean {

@Value("${cache.persistenceDir}")
private String persistenceDir;

private CacheManager cacheManager;

@Override
public void afterPropertiesSet() {
    this.cacheManager = buildCacheManager();
}

private CacheManager buildCacheManager()
{
    EhcacheCachingProvider cachingProvider = (EhcacheCachingProvider) Caching.getCachingProvider();
    DefaultConfiguration defaultConfiguration = new DefaultConfiguration(cachingProvider.getDefaultClassLoader(),
            new DefaultPersistenceConfiguration(new File(persistenceDir)));
    return cachingProvider.getCacheManager(cachingProvider.getDefaultURI(), defaultConfiguration);
}


@Override
public CacheManager getObject() {
    return this.cacheManager;
}

@Override
public Class<?> getObjectType() {
    return (this.cacheManager != null ? this.cacheManager.getClass() : CacheManager.class);
}

@Override
public boolean isSingleton() {
    return true;
}


@Override
public void destroy() {
    this.cacheManager.close();
}
}

这是我如何定义缓存的。我使用Ehcache API来创建我的缓存,因为我的缓存需要的一些功能无法通过JCache API获得。

EhcacheManager ehcacheManager = jCacheCacheManager.getCacheManager().unwrap(EhcacheManager.class);
ehcacheManager.createCache("foo", CacheConfigurationBuilder.newCacheConfigurationBuilder(
                String.class, Foo.class,
                ResourcePoolsBuilder.newResourcePoolsBuilder()
                        .heap(1)
                        .offheap(1, MemoryUnit.GB)
                        .disk(5, MemoryUnit.GB)
        ));

当我尝试从应用程序中其他地方的CacheManager检索缓存时,会引发空指针异常。

Caching.getCachingProvider().getCacheManager().getCache("foo");

但是,如果我在调用CacheManager中的getCacheNames()方法后检索缓存,则会正常提取缓存。

 Caching.getCachingProvider().getCacheManager().getCacheNames();
 Caching.getCachingProvider().getCacheManager().getCache("foo");

我错过了什么?请帮帮我。

共有1个答案

和弘博
2023-03-14

我的第一个问题是:“为什么不使用Spring缓存的内置支持?”它不需要这样做。JCacheCacheManager将处理一切。

然后,您的问题是缓存直接在Ehcache中创建,而不经过JSR107层。调用getCacheNames()会刷新JSR107中的缓存列表,使其正常工作。然而,我不确定这种全球性行为是有意的。但这就是它的工作方式。

解决方案是通过JSR107层按预期创建缓存。看起来像这样

CacheManager cacheManager = jcacheCacheManager.getCacheManager();
cacheManager.createCache("foo",
    Eh107Configuration.fromEhcacheCacheConfiguration(
        CacheConfigurationBuilder.newCacheConfigurationBuilder(String.class, Foo.class, ResourcePoolsBuilder.newResourcePoolsBuilder()
                    .heap(1)
                    .offheap(1, MemoryUnit.GB)
                    .disk(5, MemoryUnit.GB))
            .build()));
 类似资料:
  • Shiro 有三个重要的缓存接口: CacheManager - 负责所有缓存的主要管理组件,它返回 Cache 实例。 Cache - 维护key/value 对。 CacheManagerAware - 通过想要接收和使用 CacheManager 实例的组件来实现。 CacheManager 返回Cache 实例,各种不同的 Shiro 组件使用这些Cache 实例来缓存必要的数据。任何实现

  • CacheManager is an open source caching abstraction layer for .NET written in C#. It supports various cache providers and implements many advanced features. The main goal of the CacheManager package is

  • 问题内容: 我正在用Java编写命令行程序的终端包装,然后使用ProcessBuilder生成子进程。将击键发送到子,我只是写从GUI直奔 给出。为了从子流程接收输出,我基本上有一个while循环,它从子流程的中读取: 这工作, 只有 当我立刻冲在输出 都 结束。也就是说,我必须刷新每个用户输入,并且子进程必须刷新自己的输入才能发生操作。否则,将等待从未真正发送的等待数据的块(子进程的stdout

  • 我目前正在学习咖啡因,总体来说我对Spring还不熟悉。我一直在尝试用咖啡因实现缓存;然而,我发现自己遇到了几个问题。 我看到了两种配置咖啡因缓存的方法。 首先是Java类: 第二是在应用范围内。财产: 我想问一下,这两者之间有什么不同之处吗?我需要课程和应用程序吗。属性配置,还是仅其中一个?此外,在Java类实现中,cacheManager是仅应用于名为“example”的缓存,还是应用于每个缓

  • 我有几个WAR项目,其中包括对某个实用程序JAR项目的依赖。我希望能够通过使用Spring的@Cacheable注释从实用程序项目中缓存某些方法,所以我尝试在实用程序项目上创建一个配置文件,在那里我可以定义一个CacheManager bean来处理方法的缓存。配置文件如下所示: (请注意,我使用的是Redis缓存实现,但Spring配置应该与其他缓存提供程序非常相似) 我很确定配置本身不是问题,

  • 问题内容: 我没有找到CacheManager bean …但是我没有尝试使用CacheManager做任何事情! 这是我的错误! 这是我的POM.xml,可能是导致此问题的原因。 问题答案: 在上下文文件中,如果使用,IntelliJ会自动导入名称空间而不是名称空间!因此,当我为事务管理器添加标签时,就以为是cacheManager。