ehcache使用很长时间了,但是却没有用到缓存数据序列化(C#中是这么个说法)与再加载。这次因为业务中需要对缓存数据进行临时存储并再加载使用,实现该功能的方式多种多样。既然ehcache有磁盘保存机制,那就用它自带的功能吧,省时省力。

注意:要使用该功能之前,请先完成ehcache与springboot的整合

1、监听springboot的关闭事件,并在关闭事件中进行ehcahe缓存的保存。特别注意此处是 net.sf.ehcache.CacheManager,非 org.springframework.cache.CacheManager

import net.sf.ehcache.CacheManager;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextClosedEvent;
import org.springframework.stereotype.Component; @Component
public class ApplicationCloseEventListener implements ApplicationListener<ContextClosedEvent> { @Autowired
CacheManager cacheManager; @Override
public void onApplicationEvent(ContextClosedEvent event) {
cacheManager.shutdown();
}
}

2、配置ehcache的缓存数据保存路径

<?xml version="1.0" encoding="UTF-8"?>
<ehcache>
<!-- 指定一个文件目录,当EHCache把数据写到硬盘上时,将把数据写到这个文件目录下 -->
<diskStore path="D:\ehcache"/>
</ehcache>

3、为cache指定 diskPersistent 为true,启动ehcahe关闭时的数据持久化功能

<?xml version="1.0" encoding="UTF-8"?>
<ehcache>
<!-- 指定一个文件目录,当EHCache把数据写到硬盘上时,将把数据写到这个文件目录下 -->
<diskStore path="D:\ehcache"/> <!-- 设备Json对象缓存 -->
<cache name="JsonObject" maxElementsInMemory="10000"
overflowToDisk="false"
timeToIdleSeconds="1800"
timeToLiveSeconds="3600"
memoryStoreEvictionPolicy="LRU"
diskPersistent="true">
</cache>
</ehcache>

4、为cache指定启动时的数据加载类工厂

<?xml version="1.0" encoding="UTF-8"?>
<ehcache>
<!-- 指定一个文件目录,当EHCache把数据写到硬盘上时,将把数据写到这个文件目录下 -->
<diskStore path="D:\ehcache"/> <!-- 设备Json对象缓存 -->
<cache name="JsonObject" maxElementsInMemory="10000"
overflowToDisk="false"
timeToIdleSeconds="1800"
timeToLiveSeconds="3600"
memoryStoreEvictionPolicy="LRU"
diskPersistent="true">
<BootstrapCacheLoaderFactory
class="net.sf.ehcache.store.DiskStoreBootstrapCacheLoaderFactory"
properties="bootstrapAsynchronously=true" />
</cache>
</ehcache>

5、然后运行程序,Run(不是Debug)

6、退出程序,EXIT(不是Stop)

7、查看磁盘文件情况

8、赶快再次运行程序,检查一下cache数据是否还在吧!

springboot 整合 ehcahe后,实现缓存数据 应用关闭时序列化(磁盘持久化),重启再加载的更多相关文章

  1. Spring Boot 启动以后然后再加载缓存数据 CommandLineRunner

    实际应用中,我们会有在项目服务启动完成以后去加载一些数据或做一些事情(比如缓存)这样的需求. 为了解决这样的问题,Spring Boot 为我们提供了一个方法,通过实现接口 CommandLineRu ...

  2. Flutter 初始化数据完成后再加载页面

    一.初始化数据完成后再加载数据 1.为了达成这个目标尝试了多种方法总是失败 在Init 和didChangeDependencies 初始化数据过也不行 @override void didChang ...

  3. “Word自动更改后的内容保存到通用文档模板上。是否加载该模板?“的解决办法

    在win7系统下,Word2010出现了不能正常关闭.打开一个已有word文档,点击右上角关闭按钮后,先提示"word已停止工作,windows正在检查该问题的解决方案",随后提示 ...

  4. jquery循环延迟加载,用于在图片加载完成后再加载js

    <html> <head> <script type="text/javascript" src="http://lib.sinaapp.c ...

  5. .js控制一次加载一张图片,加载完后再加载下一张

    js怎么控制一次加载一张图片,加载完后再加载下一张 (1)方法1 (1)方法2

  6. Redis-基本概念、java操作redis、springboot整合redis,分布式缓存,分布式session管理等

    NoSQL的引言 Redis数据库相关指令 Redis持久化相关机制 SpringBoot操作Redis Redis分布式缓存实现 Resis中主从复制架构和哨兵机制 Redis集群搭建 Redis实 ...

  7. (十五)SpringBoot之使用Redis做缓存数据

    一.添加Redis依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns=" ...

  8. springboot整合websocket后运行测试类报错:javax.websocket.server.ServerContainer not available

    springboot项目添加websocket依赖后运行测试类报如下错误: org.springframework.beans.factory.BeanCreationException: Error ...

  9. vue 中 keep-alive 缓存数据、离开时位置

    路由中: 页面中: 需要缓存的组件中: 因为是keep-alive  所以在初始化页面的时候 会走一次生命周期 当二次进入的时候就已经是缓存状态了 不会在走生命周期 于是它就有了自己的周期函数分别是 ...

  10. ant design pro解决初始加载,有顺序的请求/请求顺序报错问题/登录后再加载其他数据/异步的顺序问题/偷跑

    方法是:如在Authorized.jsx中解决,当未登录成功(包括登录失败和登录验证中),就显示loading,否则继续 加载渲染children 一个三目运算或者if分支就可以解决,但是要写到最先加 ...

随机推荐

  1. CF510B Fox And Two Dots

    题目大意 矩阵中各个方格都有颜色,判断是否有相同颜色的方块可以组成环.(原题链接:CF510B Fox And Two Dots) 输入: 第一行:\(n\), \(m\),表示矩阵的行和列 接下来\ ...

  2. JavaScript Date转字符串格式

    JavaScript Date转字符串格式

  3. vertx学习总结5之回调函数及其限制,如网关/边缘服务示例所示未来和承诺——链接异步操作的简单模型响应式扩展——一个更强大的模型,特别适合组合异步事件流Kotlin协程

    这章我们讲回调,英文名:Beyond callbacks 一.章节覆盖: 回调函数及其限制,如网关/边缘服务示例所示 未来和承诺--链接异步操作的简单模型 响应式扩展--一个更强大的模型,特别适合组合 ...

  4. 精致的Javascript代码

    1. 统计一个数组中,每个值的个数 var cards = [1, 2, 3, 4, 3, 2, 1, 4, 5] var dict = {}; for(var i = 0; i < cards ...

  5. SpringBoot核心注解:@SpringBootApplication

    @SpringBootApplication它是由三个注解的复合: @ComponentScan @SpringConguration @EnableAutoConfiguration 三个注解的作用 ...

  6. C++中数字与字符串之间的转换(转载自http://www.cnblogs.com/luxiaoxun/)

    C++中数字与字符串之间的转换   1.字符串数字之间的转换(1)string --> char *   string str("OK");   char * p = str ...

  7. vue3在父子组件使用v-model双向绑定

    父组件: <script setup> import InputBox from "@/compon/InputBox.vue"; import {ref} from ...

  8. 华企盾DSC防泄密系统:半透明问题调试方法

    1.先添加下图中的注册表​ 2.用debugview工具监控操作过程,然后找到后面是DSE_SANDBOX,把它前面的值一个一个加到控制台的半透明沙盒对象里面调,直到找到可以正常的为止 3.用supe ...

  9. ubuntu 20.0.4 LTS 配置国内apt-get源

    https://blog.csdn.net/wangyijieonline/article/details/105360138 更换阿里源 要知道当前系统的代号,可以用以下命令: lsb_releas ...

  10. Python 潮流周刊第 34 期(摘要)

    本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...