Spring 3.1 @Cacheable - 方法仍然执行

2024-04-01

我正在尝试按照解释实现 Spring 3.1 缓存here http://www.javacodegeeks.com/2011/02/spring-31-cache-abstraction-tutorial.html and here http://blog.springsource.org/2011/02/23/spring-3-1-m1-caching/,但它似乎不起作用:我的方法每次都会运行,即使它被标记为@cacheable。我究竟做错了什么?

我已将其移至带有自己的配置文件的 junit 测试用例中,以将其与应用程序的其余部分隔离,但问题仍然发生。以下是相关文件:

Spring-test-servlet.xml

<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:cache="http://www.springframework.org/schema/cache"
   xmlns:p="http://www.springframework.org/schema/p"
   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd">
<cache:annotation-driven />

<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager" p:cache-manager-ref="ehcache"/>
<bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"
      p:config-location="classpath:ehcache.xml"/>
</beans>

ehcache.xml

<ehcache>
<diskStore path="java.io.tmpdir"/>
<cache name="cache"
       maxElementsInMemory="100"
       eternal="false"
       timeToIdleSeconds="120"
       timeToLiveSeconds="120"
       overflowToDisk="true"
       maxElementsOnDisk="10000000"
       diskPersistent="false"
       diskExpiryThreadIntervalSeconds="120"
       memoryStoreEvictionPolicy="LRU"/>

</ehcache>

MyTest.java

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:spring-test-servlet.xml"})
@Component
public class MyTest extends TestCase {

    @Test
    public void testCache1(){
        for(int i = 0; i < 5; i++){
            System.out.println("Calling someMethod...");
            System.out.println(someMethod(0));
        }
    }

    @Cacheable("testmethod")
    private int someMethod(int val){
        System.out.println("Not from cache");
        return 5;
    }
}

相关 Pom 条目:(spring-version = 3.1.1.RELEASE)

    <dependency>
        <groupId>net.sf.ehcache</groupId>
        <artifactId>ehcache-core</artifactId>
        <version>2.5.1</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context-support</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>${spring.version}</version>
    </dependency>

当我运行测试时,Spring 会发出一些调试消息,看起来我的缓存已初始化,没有错误

DEBUG: config.ConfigurationHelper - No CacheManagerEventListenerFactory class specified. Skipping...
DEBUG: ehcache.Cache - No BootstrapCacheLoaderFactory class specified. Skipping...
DEBUG: ehcache.Cache - CacheWriter factory not configured. Skipping...
DEBUG: config.ConfigurationHelper - No CacheExceptionHandlerFactory class specified. Skipping...
DEBUG: store.MemoryStore - Initialized net.sf.ehcache.store.MemoryStore for cache
DEBUG: disk.DiskStorageFactory - Failed to delete file cache.data
DEBUG: disk.DiskStorageFactory - Failed to delete file cache.index
DEBUG: disk.DiskStorageFactory - Matching data file missing (or empty) for index file. Deleting index file /var/folders/qg/xwdvsg6x3mx_z_rcfvq7lc0m0000gn/T/cache.index
DEBUG: disk.DiskStorageFactory - Failed to delete file cache.index
DEBUG: ehcache.Cache - Initialised cache: cache
DEBUG: config.ConfigurationHelper - CacheDecoratorFactory not configured. Skipping for 'cache'.
DEBUG: config.ConfigurationHelper - CacheDecoratorFactory not configured for defaultCache. Skipping for 'cache'.

但调试输出显示对 someMethod 的方法调用和每次从 someMethod 内部打印的打印语句之间没有缓存检查。

我有什么遗漏的吗?


From http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/cache.html http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/cache.html

在代理模式(默认)下,仅外部方法调用 通过代理传入的内容会被拦截。这意味着 实际上,自我调用,目标对象调用的方法 目标对象的另一个方法, 不会导致实际的 缓存在运行时即使调用的方法被标记为 @Cacheable - 在这种情况下考虑使用aspectj模式。

and

方法可见性和@Cacheable/@CachePut/@CacheEvict

使用代理时,您应该应用@Cache注释仅用于 方法与公众知名度.

  1. 你自己调用someMethod在同一个目标对象中。
  2. Your @Cacheable方法不公开。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring 3.1 @Cacheable - 方法仍然执行 的相关文章

  • 如何在 Laravel 5 中通过键获取所有缓存项的列表?

    Laravel 中的 Cache 类具有 get itemKey 等方法来从缓存中检索项目 以及 Remember itemKey myData1 myData2 来将项目保存在缓存中 还有一个方法可以检查缓存中是否存在某个项目 Cache
  • ASP.NET - Google Chrome 缓存 DropDownList 选择

    我的购物车页面上的 Google Chrome 和 Safari 似乎遇到了缓存问题 购物车中有 2 个下拉列表 当您在更改下拉列表中的值后点击结帐按钮时 它会将列表中选择的内容提交到数据库 解释意外的行为有点困难 所以我会尝试一步一步地写
  • 如何从控制器访问片段中的片段?

    我有一个名为 cutleryCustomerSearch 的视图 其中包含 替换 一个片段 div div div div 在此片段中 我有一个表 我喜欢通过 ajax 更新它 table 我如何设置处理 ajax 请求的控制器方法的返回
  • 我们如何计算这段代码片段中缓存的读取/未命中次数?

    鉴于我目前正在学习的这本教科书中的代码片段 Randal E Bryant David R O Hallaron 计算机系统 程序员的视角 第 3 版 2016 年 Pearson 全球版 因此本书的练习可能是错误的 for i 31 i
  • 如何使 Redis 缓存中数据层次结构(树)的部分内容无效

    我有一些产品数据 需要在 Redis 缓存中存储多个版本 数据由 JSON 序列化对象组成 获取普通 基本 数据的过程很昂贵 将其定制为不同版本的过程也很昂贵 因此我想缓存所有版本以尽可能进行优化 数据结构看起来像这样 BaseProduc
  • Tomcat 6 未从 WEB-INF/lib 加载 jar

    我正在尝试找出我的 tomcat 环境中的配置问题 我们的生产服务器正在运行 tomcat 安装并从共享 NFS 挂载读取战争 然而 当我尝试使用独立的盒子 及其配置 进行同样的战争时 我收到下面发布的错误 有趣的是 如果我将 WEB IN
  • 无法使用注释从 .properties 文件中提取值

    我想通过 properties 文件配置我的 bean 字符串字段 但它不会替换 value 键 意味着它会回显 value 字符串 我的代码如下 主要类别 public class Main public static void main
  • hibernate 6.0.2.Final 和 spring boot 2.7.0 的entityManagerFactory bean 未配置问题

    所以最近我想升级我的 Spring Boot 项目项目的一些依赖项 特别是这些组件 雅加达 EE 9 弹簧靴2 7 休眠 6 0 2 Final 完成此操作后 所有更新和代码折射 更新将 javax 导入到 jakarta 以及一些 hib
  • 控制缓存过期

    通过 Google 网站管理员工具的 PageSpeed 分析器运行我的网页后 它向我报告我的资源没有被缓存 下面是我的 htaccess 文件中直接取自 H5BP 的代码 我是否正确地假设以下过期时间设置正确 但我的实现中出现了问题 或者
  • 使用 Spring Data JPA 和 @Query 注释仅获取第一个/最后一个元素

    EDIT 关于此问题的第二个和第四个答案提供了此问题的解决方案Spring Data JPA 注释的 setMaxResults https stackoverflow com questions 9314078 setmaxresults
  • NSURLCache 不缓存

    我正在使用 Xcode 6 1 6A1030 iOS7 和 iOS8 模拟器 NSURLCache 似乎没有缓存任何东西 我使用 Cache Control 标头 我的服务器返回带有 max age 6000 的 Cache Control
  • 具有 JPA 持久性的 Spring 状态机 - 存储库使用

    我试图弄清楚如何轻松使用 Spring 状态机 包括使用 JPA 进行持久化 这是我正在处理的问题 不兼容的数据类型 工厂和持久性 在程序的某个时刻 我想使用连接到用户的状态机 有用于此目的的存储库 项目spring statemachin
  • 升级到 Spring boot 1.4 后服务无法启动

    我刚刚升级了所有 Spring Boot 服务1 3 6 RELEASE to 1 4 0 RELEASE 现在它们都在启动时崩溃 Caused by java lang NoClassDefFoundError org springfra
  • java.lang.IllegalStateException:未定义负载平衡的 Feign 客户端。您是否忘记包含 spring-cloud-starter-netflix-ribbon ?

    我遇到异常 FactoryBean threw exception on object creation nested exception is java lang IllegalStateException No Feign Client
  • Spring Batch 死锁 - 无法增加身份;嵌套异常是 com.microsoft.sqlserver.jdbc.SQLServerException

    我们正在将 Spring Batch 应用程序从 Oracle DB 迁移到 Azure SQL Server 我在尝试执行时收到以下错误两个不同的工作同时更新不同的表 但使用相同的公共 BATCH 表 引起原因 org springfra
  • 多线程Spring-boot控制器方法

    因此 我的应用程序 spring boot 运行速度非常慢 因为它使用 Selenium 来抓取数据 处理数据并显示在主页中 我遇到了多线程 我认为它对我的应用程序很有用 可以让它运行得更快 但是教程似乎显示在带有 main c 的普通 j
  • 使用Spring批处理从HDFS读取文件

    我必须编写一个 Spring 批处理 它将从 HDFS 读取文件并更新 MySQL DB 中的数据 HDFS 中的源文件包含一些 CSV 格式的报告数据 有人能给我举一个从 HDFS 读取文件的例子吗 Thanks The FlatFile
  • Spring Boot自动装配存储库始终为空[重复]

    这个问题在这里已经有答案了 每次我进入我的服务类时 存储库似乎都没有自动连接 因为它不断抛出 NullPointerException 谁能帮我检查一下我缺少什么吗 这是我的代码 演示应用程序 java package com exampl
  • Spring 规范 - 谓词的联合

    我需要一个函数来过滤参数并构建查询 我有 4 个参数 因此如果我尝试为每个条件实现查询 我将不得不编写 16 2 4 实施 这不是一个好主意 我尝试通过界面改进我的代码Specification来自 Spring Data JPA 但我无法
  • 过期时自动重新填充缓存

    我当前缓存方法调用的结果 缓存代码遵循标准模式 如果存在 则使用缓存中的项目 否则计算结果 在返回之前将其缓存以供将来调用 我想保护客户端代码免受缓存未命中的影响 例如 当项目过期时 我正在考虑生成一个线程来等待缓存对象的生命周期 然后运行

随机推荐

  • 点击透明图像像素

    我不希望图像的透明部分可点击 我发现
  • 是否可以在 libGDX 中禁用帧限制?

    更具体地说 是一个桌面 libGDX LWJGL 应用程序 有一些配置选项可以禁用 CPU 同步以及垂直同步 但不管应用程序以 60 fps 运行 这对于所有实际用途来说都很好 但出于好奇 如果没有别的原因 我想看看帧速率可以达到多高 罗德
  • CloudFront 如何在 S3 的现有分发服务网站上设置反向代理

    我有一个 S3 存储桶 它托管一个网站并通过 CloudFront 交付 现在我已将发行版附加到我的顶点根域 例如 www xyz com 因此 之前我们使用 Nginx 从同一域上的网络服务器根提供静态前端 www xyz com 并且还
  • Chart.js 每个点的自定义图像

    我正在使用 Chart js 并且正在寻求有关散点图上每个点的自定义图像的帮助 我尝试过使用 javascript 图像数组 但它不起作用 我是 canvas 和 html5 的新手 我想要的是每个点都是用户的小个人资料图片而不是圆圈 一个
  • 使用 Node.js 的文件系统观察器

    我想使用 node js 实现文件系统观察器 以便它监视特定目录中添加 删除的任何文件 有人可以给出如何实现这个的想法吗 Thanks 查看fs watchFile filename options listener http nodejs
  • 通过模态加载动态 URL

    假设我有以下由循环生成 X 次的链接 a class btn href Launch Modal a 这是启动模式的 JS 脚本 document ready function view more modal remote item vie
  • 权限拒绝:打开提供程序 android.support.v4.content.FileProvider

    我在尝试在 Android 模拟器中执行应用程序升级时遇到了一些问题 场景的流程来自一个 Activity 我将执行异步任务A哪个打开片段A 然后在里面异步任务A 我会检查是否有版本升级 如果可用并且用户选择了 确定 片段A 我将继续异步任
  • 调用需要 API 级别 29(当前最低为 21):`android.widget.NumberPicker#setTextColor`

    我想使用 setTextColor 更改选定的文本颜色字段 但是 Android Studio 给了我这个错误 我应该怎么办 最小 SDK 为 21 这是我的 CustomNumberPicker 类的代码 import android a
  • MongoDb 解释失败:“未知的顶级运算符:$query”

    我试图从非常简单的查询中获得解释 它使用具有以下架构的帖子集合 gt db posts findOne id ObjectId 55236e6182bf196454a952b6 Content wuOfCjKborHcxkoyXzXiW C
  • Mysql CASE WHEN JOIN 语句错误

    Mysql查询 SELECT FROM pet info LEFT JOIN lostpets ON pet info id lostpets petid LEFT JOIN pet images ON pet info id pet im
  • 页面加载后部分渲染

    我有一个包含一些用户控件的页面 我想在回发后加载这些用户控件 就像 ajax 渲染一样 每个用户控件都显示数据库中的列表 我不希望用户在服务器代码构建响应时等待 我认为如果为用户显示页面并且在通过 ajax 请求加载用户控件之后 这将很有用
  • 如何在未来取消时终止 Callable 中的 CXF Web 服务调用

    Edit 这个问题现在已经经历了几次迭代 所以请随意查看修订版本 以了解有关历史和尝试过的事情的一些背景信息 我将 CompletionService 与 ExecutorService 和 Callable 一起使用 通过 CXF 生成的
  • 包含 jQuery 会导致标准 JavaScript 停止运行?

    我正在开始使用 jQuery 我一直在尝试将它与一些预先存在的 JavaScript 代码混合 这样我就不必重写所有内容 我读过很多地方都说这是完全可行的 然而 每当我包含任何 jQuery 行时 标准 JavaScript 就会停止运行
  • RubyKoans:破损的公案?

    可能是业余爱好者的标志 我想知道问题是否出在公案 而不是我 但是 考虑一下这个公案 def test calling global methods without parentheses result my global method 2
  • 取消 ChangeNotifier 内的 Firebase 监听器

    当我尝试取消 Firestore 侦听器时ProductsService cancel 我收到错误 错误 flutter lib ui ui dart state cc 209 未处理的异常 LateInitializationError
  • JSF 2.0 validateRegex 带有自己的验证器消息

    我有一个与此类似的代码
  • 控制 Akka 中消耗大量内存的 actor 的生成

    我使用 akka 的 actor 模型构建了一个分布式流机器学习模型 通过向 Actor 发送训练实例 训练数据 来异步训练模型 对这些数据的训练会占用计算时间并改变参与者的状态 目前我正在使用历史数据来训练模型 我想运行一堆不同配置的模型
  • 如何用时刻设置时区?

    我正在使用 moment 来获取服务器时间 moment tz setDefault Asia Kolkata var now new Date var p date moment tz now zone format 插入时间 p dat
  • 在 DevExpress 中计算 ASPxGridview 列

    我有一个ASPxGridview 通常是 21 列 但我只想要处理 4 列 每列都有一个十进制值 MV EDDIE列为空 我想要的是 以编程方式计算 MV EDDIE列是RISK EUR IPOTEK MV BERND 只有在GroupSu
  • Spring 3.1 @Cacheable - 方法仍然执行

    我正在尝试按照解释实现 Spring 3 1 缓存here http www javacodegeeks com 2011 02 spring 31 cache abstraction tutorial html and here http