1、Spring也引入了对 Cache的支持,那对于如今发展得如火如荼的 Spring Boot来说自然也是支持缓存特性的。当然 Spring Boot默认使用的是 SimpleCacheConfiguration,即使用ConcurrentMapCacheManager 来实现的缓存。但本文将讲述如何将 Ehcache缓存应用到Spring Boot应用中。

2、整合步骤:

(1) 准备好数据库(mysql)

(2) 搭建工程:Springboot + MyBatis + MySQL + Ehcache

pom.xml文件

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!--for mybatis--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>1.3.2</version></dependency><!--for Mysql--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><!-- Spring boot Cache--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId></dependency><!--for ehcache--><dependency><groupId>net.sf.ehcache</groupId><artifactId>ehcache</artifactId></dependency></dependencies>

(3) 建立 Ehcache配置文件

创建Ehcache的配置文件 ehcache.xml并置于项目 classpath下:

<?xml version="1.0" encoding="UTF-8"?>
<ehcache><diskStore path="java.io.tmpdir"/><!-- 设定缓存的默认数据过期策略 --><defaultCachemaxElementsInMemory="10000"eternal="false"timeToIdleSeconds="120"timeToLiveSeconds="120"overflowToDisk="true"maxElementsOnDisk="10000000"diskPersistent="false"diskExpiryThreadIntervalSeconds="120"memoryStoreEvictionPolicy="LRU"/><cache name="user"maxElementsInMemory="1000"eternal="false"timeToIdleSeconds="10"/></ehcache>

(4) 配置 application.properties

server.port=80# Mysql 数据源配置
spring.datasource.url=jdbc:mysql://121.196.213.251:3306/demo?useUnicode=true&characterEncoding=utf-8&useSSL=false
spring.datasource.username=root
spring.datasource.password=xxxxxx
spring.datasource.driver-class-name=com.mysql.jdbc.Driver# mybatis 配置
mybatis.type-aliases-package=cn.codesheep.springbt_ehcache.entity
mybatis.mapper-locations=classpath:mapper/*.xml
mybatis.configuration.map-underscore-to-camel-case=true# ehcache 配置
spring.cache.ehcache.config=classpath:ehcache.xml

(5) 编写操作数据库和 Ehcache缓存的业务代码

public class User {private Long userId;private String userName;private Integer userAge;public Long getUserId() {return userId;}public void setUserId(Long userId) {this.userId = userId;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public Integer getUserAge() {return userAge;}public void setUserAge(Integer userAge) {this.userAge = userAge;}
}

(6) 编写mapper

public interface UserMapper {List<User> getUsers();int addUser(User user);List<User> getUsersByName( String userName );
}

(7) 编写service

@Service
public class UserService {@Autowiredprivate UserMapper userMapper;public List<User> getUsers() {return userMapper.getUsers();}public int addUser( User user ) {return userMapper.addUser(user);}@Cacheable(value = "user", key = "#userName")public List<User> getUsersByName( String userName ) {List<User> users = userMapper.getUsersByName( userName );System.out.println( "从数据库读取,而非读取缓存!" );return users;}
}

看得很明白了,我们在getUsersByName接口上添加了注解:@Cacheable。这是 Ehcache的使用注解之一,除此之外常用的还有@CachePut@CacheEvit,分别简单介绍一下:

  1. @Cacheable:配置在 getUsersByName方法上表示其返回值将被加入缓存。同时在查询时,会先从缓存中获取,若不存在才再发起对数据库的访问
  2. @CachePut:配置于方法上时,能够根据参数定义条件来进行缓存,其与 @Cacheable不同的是使用 @CachePut标注的方法在执行前不会去检查缓存中是否存在之前执行过的结果,而是每次都会执行该方法,并将执行结果以键值对的形式存入指定的缓存中,所以主要用于数据新增和修改操作上
  3. @CacheEvict:配置于方法上时,表示从缓存中移除相应数据。

(8) 编写controller

@RestController
public class UserController {@Autowiredprivate UserService userService;@AutowiredCacheManager cacheManager;@GetMapping("/users")public List<User> getUsers() {return userService.getUsers();}@GetMapping("/adduser")public int addSser() {User user = new User();user.setUserId(4l);user.setUserName("赵四");user.setUserAge(38);return userService.addUser(user);}@RequestMapping( value = "/getusersbyname", method = RequestMethod.POST)public List<User> geUsersByName( @RequestBody User user ) {System.out.println( "-------------------------------------------" );System.out.println("call /getusersbyname");System.out.println(cacheManager.toString());List<User> users = userService.getUsersByName( user.getUserName() );return users;}}

(9) 改造SpringBoot应用主类

@SpringBootApplication
@MapperScan("cn.codesheep.springbt_ehcache")
@EnableCaching
public class SpringbtEhcacheApplication {public static void main(String[] args) {SpringApplication.run(SpringbtEhcacheApplication.class, args);}
}

(10) 实际实验

通过多次向接口localhost/getusersbynamePOST数据来观察效果:

可以看到缓存的启用和失效时的效果(上文ehcache的配置文件中设置了缓存user的实效时间为10s):

ehcache springboot_Spring Boot应用缓存实践之:Ehcache加持相关推荐

  1. ehcache springboot_Spring Boot 入门示例合集(附源代码)

    Spring Boot 入门实战示例 本项目是自己在学习 Spring Boot 时整理的一系列笔记,包含 Spring Boot 使用的各种示例,可以快速上手 Spring Boot 整合的一些子项 ...

  2. Spring Boot文档阅读笔记-EhCache的使用

    这里要先注意2个概念: buffer和cache,很多人会讲这两个概念混用.但其实这是两个概念! buffer:一般是指存储临时数据的实体.只能读写一次,对于程序员来说buffer是可见的,比如TCB ...

  3. SpringBoot2 整合Ehcache组件,轻量级缓存管理

    本文源码:GitHub·点这里 || GitEE·点这里 一.Ehcache缓存简介 1.基础简介 EhCache是一个纯Java的进程内缓存框架,具有快速.上手简单等特点,是Hibernate中默认 ...

  4. 【SpringBoot】27、SpringBoot中整合Ehcache实现热点数据缓存

    EhCache 是一个纯 Java 的进程内缓存框架,具有快速.精干等特点,是 Hibernate 中默认的 CacheProvider.用惯了 Redis,很多人可能已经忘记了还有 EhCache ...

  5. (转)使用 Spring缓存抽象 支持 EhCache 和 Redis 混合部署

    背景:最近项目组在开发本地缓存,其中用到了redis和ehcache,但是在使用注解过程中发现两者会出现冲突,这里给出解决两者冲突的具体方案. spring-ehcache.xml配置: <?x ...

  6. mybatis教程--查询缓存(一级缓存二级缓存和整合ehcache)

    查询缓存 1 缓存的意义 将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用从磁盘上(关系型数据库数据文件)查询,从缓存中查询,从而提高查询效率,解决了高并发系统的性能问题. 2 mybat ...

  7. 三)mybatis 二级缓存,整合ehcache

    mybatis-config.xml <setting name="cacheEnabled" value="true" /> PersonMapp ...

  8. Spring测试上下文缓存+ AspectJ @Transactional + Ehcache的痛苦

    您在使用AspectJ @Transactionals和Spring吗? 您是否有多个SessionFactory,也许一个用于嵌入式数据库进行单元测试,一个用于实际数据库进行集成测试? 您是否遇到这 ...

  9. Java缓存框架使用EhCache结合Spring AOP

    Java缓存框架使用EhCache结合Spring AOP 一.Ehcache简介     EhCache是一个纯Java的进程内缓存框架,具有如下特点:     1. 快速简单,非常容易和应用集成. ...

最新文章

  1. 以编程方式确定Java类的JDK编译版本
  2. Intel官宣开发RISC-V处理器:明年首发7nm工艺
  3. uburntu在不能自动获取网络时的联网设置
  4. .Net程序猿玩转Android开发---(8)表格布局TableLayout
  5. [译]应用内搜索功能实现 Android TV应用程序手册教程十三
  6. Android的banner(轮播图)的实现
  7. OD 手动脱壳 - UPX
  8. python实现自动打电话软件_python 实现手机自动拨打电话的方法(通话压力测试)
  9. 信号的平均功率与均方值
  10. 很强大的上网行为管理终端软件-云子可信-一键禁止访问视频网站
  11. 两年后再次遇到的Oracle启动报错,ORA-01012:not logged
  12. 莫队算法学习笔记(一)——普通莫队
  13. 项目Beta冲刺(4/7)(追光的人)(2019.5.26)
  14. 【RDMA】intel 因特尔RDMA 驱动和ibverslib 库安装笔记
  15. 华硕重装后进入bios_华硕台式机重装系统win10按哪个键进入bios设置
  16. 每日写题分享--优先队列
  17. 【脑电数据处理】electrophysiology and EEG(AP\LFP\ECoG\EEG)
  18. 一个月面试大厂,中厂,小厂的总结|2021 年中总结
  19. C#读写修改设置调整UVC摄像头画面-伽玛
  20. matlab通信仿真的免费网站 集合

热门文章

  1. 以“数”赋能驱动企业转型 美的集团秘诀都在这里
  2. 联想618首战告捷,是战略潜力的释放还是最后的“狂欢”?
  3. 从老赖们“维权”,看拍拍贷的底色
  4. excel对比_质量管理误区:SPC软件与微软Excel的应用对比
  5. php获得注册信息,PHP网络编程:获取用户的注册信息[2]
  6. SimpleRAR-攻防世界-Misc(图文详解),文件块和子块,图片的隐写二维码
  7. python中%r和%s的区别
  8. python教程:几个基础类型循环删除
  9. Python判断字符串是否xx开始或结尾
  10. Python的几种主动结束程序方式