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