我正在使用 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/