java - 当进程被终止时,Ehcache 不会刷新到磁盘

标签 java spring caching ehcache

我正在使用 Springboot 2.1.3.RELEASE 以及 Spring Cache 和 Ehcache。我认为 Springboot 父 pom 中 Ehcache 的默认版本是 2.10.6。我使用缓存将所有昂贵的配置单元查询结果直接保存到磁盘,ehcache.xml 如下所示:

<diskStore path="D:\ehcache"/> 
    <defaultCache name="default"
            maxElementsInMemory="1"
            eternal="true"
            diskExpiryThreadIntervalSeconds="120"
                  overflowToDisk="true"
                  diskPersistent="true"
            memoryStoreEvictionPolicy="LRU">
    </defaultCache>

    <cache name="myCache"></cache>

在使用 IntelliJ 开发应用程序的过程中,我注意到缓存有时会丢失,但有时没关系。即使我不修改任何代码,结果仍然是不可预测的。我花了两天的时间进行实验,最后我注意到,如果我点击 Exit 按钮而不是 Stop(我作为 Java 开发人员的整个职业生涯都是这样),缓存就不会发生变化。我没有迷失过,一次也没有。但挑战在于,当 Intellij 在 Debug模式下运行时,没有 Exit 按钮。我做了研究,发现(不记得在哪里)它是故意这样设计的,解释是当在运行模式下运行时,用户应用程序被某种包装器包装,后者负责接收退出请求并对其进行操作,但 Debug模式没有这样的包装器,接下来可以做的事情是仅当用户应用程序在断点处挂起时才评估 System.exit(0)。

我的问题是,由于我不关心性能,我可以让 ehcache 在每次将对象保存到磁盘时刷新到磁盘吗?这样它就变成了停止/杀伤阻力?虽然我是 Ehcache 的新手,但我做了很多搜索,但在我的配置中找不到任何错误。请帮忙。谢谢。

最佳答案

Ehcache 开源磁盘存储只有在正确关闭的情况下才会在下次启动时加载。

任何其他退出(通过应用程序崩溃、终止或任何其他方式)都会导致磁盘存储被视为脏,因此它将在下次启动时被删除。

Ehcache 提供了具有防崩溃磁盘存储的企业版,但顾名思义,这不再是免费产品。

参见the documentation了解详情。请注意,链接的文档适用于版本 3,但原理是相同的。

关于java - 当进程被终止时,Ehcache 不会刷新到磁盘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55978474/

相关文章:

java - 使用项目数组初始化 HashMap?

java - 我使用 Guava 的理想缓存

c# - 静态内容不在 Asp.net MVC 中缓存

java - JSON解析抛出异常:

java - RichFaces 4.2 转发到新页面,h :commandLink

java - 安卓/Java : how to avoid repetitive errors logs?

Java Spring 从 java 类创建数据库表给出 BeanCreationException

java - Tomcat 中 JPA+Spring+Hibernate 的容器管理事务

java - 从 4.2.0.RC3 升级到 4.2.0.RELEASE 时出现 Spring Async 问题

ruby-on-rails - 使用正则表达式查询 Rails 缓存以允许部分匹配并返回多个项目