ehcache springboot_Spring Boot应用缓存实践之:Ehcache加持
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
,分别简单介绍一下:
- @
Cacheable
:配置在getUsersByName
方法上表示其返回值将被加入缓存。同时在查询时,会先从缓存中获取,若不存在才再发起对数据库的访问 @CachePut
:配置于方法上时,能够根据参数定义条件来进行缓存,其与@Cacheable
不同的是使用@CachePut
标注的方法在执行前不会去检查缓存中是否存在之前执行过的结果,而是每次都会执行该方法,并将执行结果以键值对的形式存入指定的缓存中,所以主要用于数据新增和修改操作上@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/getusersbyname
POST数据来观察效果:
可以看到缓存的启用和失效时的效果(上文ehcache的配置文件中设置了缓存user的实效时间为10s):
ehcache springboot_Spring Boot应用缓存实践之:Ehcache加持相关推荐
- ehcache springboot_Spring Boot 入门示例合集(附源代码)
Spring Boot 入门实战示例 本项目是自己在学习 Spring Boot 时整理的一系列笔记,包含 Spring Boot 使用的各种示例,可以快速上手 Spring Boot 整合的一些子项 ...
- Spring Boot文档阅读笔记-EhCache的使用
这里要先注意2个概念: buffer和cache,很多人会讲这两个概念混用.但其实这是两个概念! buffer:一般是指存储临时数据的实体.只能读写一次,对于程序员来说buffer是可见的,比如TCB ...
- SpringBoot2 整合Ehcache组件,轻量级缓存管理
本文源码:GitHub·点这里 || GitEE·点这里 一.Ehcache缓存简介 1.基础简介 EhCache是一个纯Java的进程内缓存框架,具有快速.上手简单等特点,是Hibernate中默认 ...
- 【SpringBoot】27、SpringBoot中整合Ehcache实现热点数据缓存
EhCache 是一个纯 Java 的进程内缓存框架,具有快速.精干等特点,是 Hibernate 中默认的 CacheProvider.用惯了 Redis,很多人可能已经忘记了还有 EhCache ...
- (转)使用 Spring缓存抽象 支持 EhCache 和 Redis 混合部署
背景:最近项目组在开发本地缓存,其中用到了redis和ehcache,但是在使用注解过程中发现两者会出现冲突,这里给出解决两者冲突的具体方案. spring-ehcache.xml配置: <?x ...
- mybatis教程--查询缓存(一级缓存二级缓存和整合ehcache)
查询缓存 1 缓存的意义 将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用从磁盘上(关系型数据库数据文件)查询,从缓存中查询,从而提高查询效率,解决了高并发系统的性能问题. 2 mybat ...
- 三)mybatis 二级缓存,整合ehcache
mybatis-config.xml <setting name="cacheEnabled" value="true" /> PersonMapp ...
- Spring测试上下文缓存+ AspectJ @Transactional + Ehcache的痛苦
您在使用AspectJ @Transactionals和Spring吗? 您是否有多个SessionFactory,也许一个用于嵌入式数据库进行单元测试,一个用于实际数据库进行集成测试? 您是否遇到这 ...
- Java缓存框架使用EhCache结合Spring AOP
Java缓存框架使用EhCache结合Spring AOP 一.Ehcache简介 EhCache是一个纯Java的进程内缓存框架,具有如下特点: 1. 快速简单,非常容易和应用集成. ...
最新文章
- 以编程方式确定Java类的JDK编译版本
- Intel官宣开发RISC-V处理器:明年首发7nm工艺
- uburntu在不能自动获取网络时的联网设置
- .Net程序猿玩转Android开发---(8)表格布局TableLayout
- [译]应用内搜索功能实现 Android TV应用程序手册教程十三
- Android的banner(轮播图)的实现
- OD 手动脱壳 - UPX
- python实现自动打电话软件_python 实现手机自动拨打电话的方法(通话压力测试)
- 信号的平均功率与均方值
- 很强大的上网行为管理终端软件-云子可信-一键禁止访问视频网站
- 两年后再次遇到的Oracle启动报错,ORA-01012:not logged
- 莫队算法学习笔记(一)——普通莫队
- 项目Beta冲刺(4/7)(追光的人)(2019.5.26)
- 【RDMA】intel 因特尔RDMA 驱动和ibverslib 库安装笔记
- 华硕重装后进入bios_华硕台式机重装系统win10按哪个键进入bios设置
- 每日写题分享--优先队列
- 【脑电数据处理】electrophysiology and EEG(AP\LFP\ECoG\EEG)
- 一个月面试大厂,中厂,小厂的总结|2021 年中总结
- C#读写修改设置调整UVC摄像头画面-伽玛
- matlab通信仿真的免费网站 集合
热门文章
- 以“数”赋能驱动企业转型 美的集团秘诀都在这里
- 联想618首战告捷,是战略潜力的释放还是最后的“狂欢”?
- 从老赖们“维权”,看拍拍贷的底色
- excel对比_质量管理误区:SPC软件与微软Excel的应用对比
- php获得注册信息,PHP网络编程:获取用户的注册信息[2]
- SimpleRAR-攻防世界-Misc(图文详解),文件块和子块,图片的隐写二维码
- python中%r和%s的区别
- python教程:几个基础类型循环删除
- Python判断字符串是否xx开始或结尾
- Python的几种主动结束程序方式