优化一个去年的项目,用上了Ehcache,使用了.xml+注解的方法

奇怪的是,使用缓存之后项目效率并没有得到任何提升

开始发现的是注解问题:

 @Cacheable(value = "JSDRK",key = "#p0",condition = "#p0==null",unless = "#result==null")

此处

condition=false时,不读取缓存,直接执行方法体,并返回结果,同时返回结果也不放入缓存。

ndition=true时,读取缓存,有缓存则直接返回。无则执行方法体,同时返回结果放入缓存(如果配置了result,且要求不为空,则不会缓存结果)。

应该改为

​@Cacheable(value = "JSDRK",key = "#p0",condition = "#p0==null",unless = "#result==null")​

Service的Impl类里我放了两种方法:1是注释了@Cacheable的方法,用来读取数据库  2.实现具体功能的方法,供给Controller的接口调用,该方法还会调用前一种方法

这时我在Controller做了一个测试,调用1类方法

public void getTest(){A a= educationService.getA("ME078");System.out.println(System.getProperty("java.io.tmpdir"));educationService.getA("ME078");educationService.getA("ME078");educationService.getA("ME078");}

发现成功了,key=ME078的查询sql只出现了一次

这时候反过来测试项目,发现效率还是没有提升。经过几个小时排查,终于发现原因是:

一个方法A调同一个类里的另一个有缓存注解的方法B,这样是不走缓存的。

Spring 使用@Cacheable添加缓存是基于面向切面的思想做的,实际上就是使用Java动态代理,创建实例的时候注入的是代理对象,在代理对象里调用实际的对象,这样就可以在实际的方法执行前,处理一下缓存的逻辑:没有找到缓存就往下执行,执行完把结果加入到缓存中;找到缓存则直接返回缓存的结果,不调用执行实际的方法。

使用@Cacheable添加缓存实际上就是使用动态代理做的,在代理的方法前后做缓存的相应处理。这样一来,单独的去调方法B是有缓存的,但是如果调方法A,A里面再去调B方法,哪怕B方法配置了缓存,也是不会生效的。

解决方法参考了这篇文章

a、不使用注解的方式,直接取 Ehcache 的 CacheManger 对象,把需要缓存的数据放到里面,类似于使用 Map,缓存的逻辑自己控制

b、把方法A和方法B放到两个不同的类里面,例如:如果两个方法都在service接口里,把方法B放到另一个service里面,这样A方法里调B方法,就可以使用B方法的缓存

Java Spring+Ehcache,完成配置后缓存失效问题相关推荐

  1. spring+ehcache实现页面整体缓存和页面局部缓存

    第一步:首先配置ehcache.xml指定我们的SimplePageCachingFilter缓存  ,这里指定页面缓存的生命周期是60秒,还有timeToIdleSeconds的时间爱你是120秒, ...

  2. Spring整合MyBatis导致一级缓存失效问题

    熟悉MyBatis的小伙伴都知道MyBatis默认开启一级缓存,当我们执行一条查询语句后,MyBatis会以我们查询的信息生成一个缓存key,查询的结果为value,存到一个map中,即存入一级缓存. ...

  3. ejb客户端的三种调用方法,以及InitialContext lookup后的jndi对象在服务重启后缓存失效的问题

    1.第一种调用方法: Properties p = new Properties();p.setProperty("java.naming.factory.initial", &q ...

  4. JAVA Spring 简单的配置和操作 ( 创建实体类, 配置XML文件, 调试 )

    < 1 > 实体类 Person package java_spring.modle;/*** 一个实体类( Person )*/ public class Person {private ...

  5. spring boot自动配置

    首先,一般的java Web项目需要很多配置,web配置(web.xml).spring配置(默认叫applicationContext.xml),非常繁琐 而spring-boot-starter是 ...

  6. 实战:基于 Spring 的应用配置如何迁移至阿里云应用配置管理 ACM

    最近遇到一些开发者朋友,准备将原有的Java Spring的应用配置迁移到 阿里云应用配置管理 ACM 中.迁移过程中,遇到不少有趣的问题.本文将通过一个简单的样例来还原迁移过程中遇到的问题和相关解决 ...

  7. Spring Boot 自动配置的原理、核心注解以及利用自动配置实现了自定义 Starter 组件

    本章内容 自定义属性快速入门 外化配置 自动配置 自定义创建 Starter 组件 摘录:读书是读完这些文字还要好好用心去想想,写书也一样,做任何事也一样 图 2 第二章目录结构图 第 2 章 Spr ...

  8. java任务调度定时器,从零开始学 Java - Spring 使用 Quartz 任务调度定时器

    生活的味道 睁开眼看一看窗外的阳光,伸一个懒腰,拿起放在床一旁的水白开水,甜甜的味道,晃着尾巴东张西望的猫猫,在窗台上舞蹈.你向生活微笑,生活也向你微笑. 请你不要询问我的未来,这有些可笑.你问我你是 ...

  9. 从零开始学 Java - Spring 集成 Memcached 缓存配置(二)

    Memcached 客户端选择 上一篇文章 从零开始学 Java - Spring 集成 Memcached 缓存配置(一)中我们讲到这篇要谈客户端的选择,在 Java 中一般常用的有三个: Memc ...

最新文章

  1. 用python做乘法口诀表_使用python写乘法口诀表
  2. 控制客户端对同一个服务端地址的连接端口数量
  3. 批处理显示语句学习(echo、 @ 、 pause)
  4. 服务器无法执行该事务_分布式事务、MVCC、事务隔离级别
  5. How to adjust OOM score for a process?
  6. MongoDB监控及报警
  7. linux操作系统的体系结构
  8. mysql 备份如何使用_如何使用命令来备份和还原MySQL数据库
  9. SVP——一种用于深度学习的高效数据选择方法
  10. 经验系列之java拦截器获取POST入参导致@RequestBody参数丢失问题解决
  11. 【新书推荐】【2021】基于多源信息融合的航天器自主导航技术
  12. 软媒时间---任务栏滚动工具
  13. 新加坡国际学校IB课程体系
  14. BitTorrent应用
  15. Android学习之——APP番茄工作法——小结(2)
  16. C#编程,输入里程数和耗油量,计算每升的里程数,程序中使用异常处理器,当输入的里程数或耗油量无法转换成double值时处理FormatException。
  17. 怎么让鼠标带黄色光圈?
  18. Linux中curl命令详解
  19. 高速PCB设计中过孔的设计需要掌握的知识!
  20. steam平台,分手厨房2如何实现键盘+手柄,双人游戏

热门文章

  1. Dynamic Wallpaper for Mac(Mac动态壁纸桌面)v11.4中文版
  2. android 视频通话 项目 源码
  3. Python主机探测,存活发现主机
  4. transform.normalize
  5. Ext.js正则小结
  6. 企业应该如何选择访客管理系统?
  7. 数据库DRDS中间件介绍
  8. 双核服务器和双路服务器三大区别
  9. 古井贡酒·年份原浆2018十大经济年度人物揭晓
  10. 受托支付 java_智慧职教云课堂Java程序设计基础(哈尔滨职业技术学院)作业答案...