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

WildFly 10,JCache-方法缓存

酆乐湛
2023-03-14

我有一个使用Spring Boot的简单应用程序。我希望允许使用JSR107-JCache进行方法缓存。在教程的帮助下,我编写了以下代码:

@CacheResult(cacheName = "testpoc")
public Country getCountry(Integer id){
    System.out.println("---> Loading country with code '" + id + "'");
    return new Country(id, "X", "Title");
}

使用此POM文件

...
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>1.4.0.RELEASE</version>
    </dependency>
    <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-cache</artifactId>
         <version>1.4.0.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>javax.cache</groupId>
        <artifactId>cache-api</artifactId>
        <version>1.0.0</version>
    </dependency>
</dependencies>
...

(依赖“spring-boot-starter-web”用于调用getCountry方法的简单REST服务)

一切都像文档所说的那样工作——方法只调用一次。

现在我想在WildFly 10应用服务器上试用它

我修改了pom文件:

  • 排除tomcat

在pastebin上检查pom文件。

问题是,我收到以下错误:找不到名为“java: jboss/infinispan/app-cache”的缓存

(我尝试使用JNDI分配和名称来配置infinispan缓存)。

以下代码创建了Cache对象(所以我可以使用它):

CacheManager cacheManager = Caching.getCachingProvider().getCacheManager();
Cache<String, String> cache = cacheManager.createCache("testpoc", new MutableConfiguration<String, String>());

问题:

  • 可以使用WildFly管理的Infinispan在WildFly 10上使用JCache方法缓存
  • 或者Infinispan应该用于像JCache一样的方法缓存,因此JCache比Infinispan具有“更多功能”

非常感谢

PS:我把整个代码放在github和post link上不是问题-它是几行代码......

共有1个答案

尤钱明
2023-03-14

你的方法有几个问题,所以让我分步骤介绍一下。

首先,您需要使用适当的Infinispan设置。WF附带的Infinispan位应视为内部或私有。为了在应用程序中正确使用Infinispan,可以添加org。infinispan:infinispan嵌入到部署中或安装infinispan Wildfly模块。您可以在这里找到安装指南(它有点过时,但过程完全相同-将模块解包到WF中,并使用依赖项MANIFEST.MF条目)。

成功安装Infinispan(或将其添加到您的应用程序中)后,您需要考虑是要使用Spring Cache还是JCache。如果您只对使用注释感兴趣——我会推荐前者,因为它更容易设置(您需要做的就是将@EnableCache添加到您的配置之一)。最后,使用Spring Cache,您将创建一个InfinispanCacheManagerbean。可以在此处找到一个示例。

最后一点注意:如果您仍然需要使用JCache,请使用本手册来设置缓存提供程序。

 类似资料:
  • 我有一个使用Spring缓存注释的Spring Boot应用程序。现在我想迁移到JSR-107(JCache)注释。 这是我的方法: 我希望我的新方法是这样的: 计算器输入类: @CacheKey注释指示spring将整个CalculatorInput对象存储为Key。我只想使用CalculatorInput类的属性id作为键。 我如何创建一个缓存键(就像我在Spring缓存注释中所做的那样),但

  • JCACHE是一种即将公布的标准规范(JSR 107),说明了一种对Java对象临时在内存中进行缓存的方法,包括对象的创建、共享访问、假脱机(spooling)、失效、各JVM的一致性等。它 可被用于缓存JSP内最经常读取的数据,如产品目录和价格列表。利用JCACHE,多数查询的反应时间会因为有缓存的数据而加快(内部测试表明反应时间大 约快15倍)。

  • ehcache-jcache 是 ehcache 对 JCache 标准 API (JSR107) 的实现。

  • 我使用JCache和Infinispan作为它的实现。JCache不提供任何与集群相关的API,所以我在XML配置文件中定义了简单的复制缓存配置: 现在要创建用户缓存,我需要将这种声明性配置与编程配置结合起来,因为一些缓存属性的值(例如过期超时)应该从数据库中检索。有没有办法只使用JCache中的类和接口来做到这一点?

  • 32.4 JCache (JSR-107) 注解 Spring Framework 4.1 以来,缓存抽象完全支持 JCache 标准:即 @CacheResult,@CachePut,@CacheRemove 和 @CacheRemoveAll 还有 @CacheDefaults,@CacheKey 和 @CacheValue 。这些注解被大家正确的使用,体现了缓存在 JSR-107 的实现:缓

  • 我想跨调用缓存方法ID。为此,我得到方法ID: 我的问题是:我是否需要使用NewGlobalRef创建全局引用,或者可以从本地引用获取并保存方法ID(我使用FindClass获取class\u HelloWorld),而不需要全局引用类元数据?