本文主要讲ssm框架整合EhCache。或许有人会问什么是ehcache。html
关于EhCache的介绍和优劣,我想下面的解答足以让读者明白:前端
EhCache 是一个纯Java的进程内缓存框架,具备快速、精干等特色,是Hibernate中默认的CacheProvider。Ehcache是一种普遍使用的开 源Java分布式缓存。主要面向通用缓存,Java EE和轻量级容器。它具备内存和磁盘存储,缓存加载器,缓存扩展,缓存异常处理程序,一个gzip缓存servlet过滤器,支持REST和SOAP api等特色。java
优势:
1. 快速
2. 简单
3. 多种缓存策略
4. 缓存数据有两级:内存和磁盘,所以无需担忧容量问题
5. 缓存数据会在虚拟机重启的过程当中写入磁盘
6. 能够经过RMI、可插入API等方式进行分布式缓存
7. 具备缓存和缓存管理器的侦听接口
8. 支持多缓存管理器实例,以及一个实例的多个缓存区域
9. 提供Hibernate的缓存实现mysql
缺点:
1. 使用磁盘Cache的时候很是占用磁盘空间:这是由于DiskCache的算法简单,该算法简单也致使Cache的效率很是高。它只是对元素直接追加存储。所以搜索元素的时候很是的快。若是使用DiskCache的,在很频繁的应用中,很快磁盘会满。
2. 不能保证数据的安全:当忽然kill掉java的时候,可能会产生冲突,EhCache的解决方法是若是文件冲突了,则重建cache。这对于Cache 数据须要保存的时候可能不利。固然,Cache只是简单的加速,而不能保证数据的安全。若是想保证数据的存储安全,可使用Bekeley DB Java Edition版本。这是个嵌入式数据库。能够确保存储安全和空间的利用率。web
或许还有人很疑惑缓存,什么是缓存?为何须要缓存?算法
引用百度百科的回答:spring
缓存就是数据交换的缓冲区(称做Cache),当某一硬件要读取数据时,会首先从缓存中查找须要的数据,若是找到了则直接执行,找不到的话则从内存中找。因为缓存的运行速度比内存快得多,故缓存的做用就是帮助硬件更快地运行。sql
由于缓存每每使用的是RAM(断电即掉的非永久储存),因此在用完后仍是会把文件送到硬盘等存储器里永久存储。电脑里最大的缓存就是内存条了,最快的是CPU上镶的L1和L2缓存,显卡的显存是给显卡运算芯片用的缓存,硬盘上也有16M或者32M的缓存。数据库
或许还有人会问内存是什么?express
引用百度百科的回答:
内存是计算机中重要的部件之一,它是与CPU进行沟通的桥梁。计算机中全部程序的运行都是在内存中进行的,所以内存的性能对计算机的影响很是大。内存(Memory)也被称为内存储器,其做用是用于暂时存放CPU中的运算数据,以及与硬盘等外部存储器交换的数据。只要计算机在运行中,CPU就会把须要运算的数据调到内存中进行运算,当运算完成后CPU再将结果传送出来,内存的运行也决定了计算机的稳定运行。 内存是由内存芯片、电路板、金手指等部分组成的。
也许还人会骂我,说你怎么尽引用百度百科。
个人回答是,由于我对此也不知道怎么回答。
若是让我回答在开发中为何须要缓存及其缓存的做用,个人回答是,对于有些数据,我只需查询一遍就能够,不须要再度查询,由于有缓存。就比如数据库优化,除了索引以外,还有就是将数据库里面的数据缓存起来,这样对于大规模数据,日常须要屡次查询,致使耗费时间很长,性能差,可是我经过缓存,只需查询一次,当再次查询时,就很是快,对整个系统的响应和性能也不会有什么影响。固然了,当涉及到缓存的数据与实际数据库中的数据存在差别时,这里后续会讲采起怎样的方式解决这个问题。
另外建议软件开发的朋友们,有空多多去熟悉熟悉计算机相关的理论知识。正所谓有句话叫作:万变不离其宗。这个其宗在计算机中能够理解为算法与数据结构、操做系统、TCP/IP、计算机基础知识、编译原理等等。把握好这些,编程之路才能越走越长。
这也是一位朋友对我说的。
下面进入正题,关于SSM框架整合EhCache
sql脚本准备
1、导入Maven依赖
2、编写实体
3、编写DAO
4、编写业务接口类
5、编写业务接口实现类
package com.blog.service.impl; import com.blog.entity.User; import com.blog.mapper.UserDao; import com.blog.service.UserService; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONObject; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.service.impl.ServiceImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; /** * <p> * 服务实现类 * </p> * * @author youcong123 * @since 2018-07-22 */ @Service public class UserServiceImpl extends ServiceImpl<UserDao, User> implements UserService { @Autowired private UserDao userDao; @Override @Cacheable(value="cacheTest") public User getUserById(String userId) { return userDao.selectById(userId); } @Override public User login(String loginCode) { User user = new User(); user.setLoginCode(loginCode); return userDao.selectOne(user); } } 6、编写Controller package com.blog.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.blog.entity.User; import com.blog.service.UserService; import cn.hutool.json.JSONObject; /** * <p> * 前端控制器 * </p> * * @author youcong123 * @since 2018-07-22 */ @RestController @RequestMapping("/user") public class UserController { @Autowired private UserService userService; @GetMapping(value="getById",produces="application/json;charset=utf-8") public Object getById(String userId) { JSONObject json = new JSONObject(); User user = userService.getUserById(userId); json.put("user", user); return user; } }
7、编写DAO对应的XML
UserDao.xml
8、编写配置文件
spring.xml
spring-mybatis.xml
spring-mvc.xml
config.properties
ehcache-setting.xml
关于diskstore配置说明:
一、diskStore元素是可选的,非必须的。若是不使用磁盘存储,只须要将diskStore注释掉便可;若是使用,须要在ehcache.xml文件中的ehcahce元素下的定义一个diskStore元素并指定其path属性。
二、由diskStore元素是定义在ehcache元素下咱们看出diskStore在CacheManager范围内是共享的,其是线程安全的
三、对于任何缓存,若是你已经激活了overflowToDisk或diskPersistent,就要配置磁盘存储器。
(关于overflowToDisk或diskPersistent的配置,详见配置文件ehcache.xml详解(1) )
四、DiskStore中驱除元素跟MemoryStore中驱除元素的规则是不同的。当往DiskStore中添加元素且此时DiskStore中的容量已经超出限制时将采用LFU(最不经常使用)驱除规则将对应的元素进行删除,并且该驱除规则是不可配置的(经过cache中的diskExpiryThreadIntervalSeconds属性完成)
五、path属性若是是下述Java系统属性之一,他将会被运行中的VM中的值替换。为了向后兼容,这些应该被特别规定,而不会被${token}替换语法封闭。
六、path属性能够配置的目录有:
user.home(用户的家目录)
user.dir(用户当前的工做目录)
java.io.tmpdir(默认的临时目录)
ehcache.disk.store.dir(ehcache的配置目录)
绝对路径(如:d://javastore)
mybatis-config.xml
log4j.properties
web.xml
9、运行项目,若是控制台五报错,就经过PostMan接口测试
PostMan可运行屡次 发现控制台始终都只打印一次就表示缓存成功