grails - Grails 中的 "Could not remove disk store entry for [Class]"- 如何禁用基于磁盘的缓存?

标签 grails ehcache

我的 Grails 应用程序中抛出以下异常:

[1564928] store.DiskStore ClassNameCache: Could not remove disk store entry for ClassName#123195371. Error was null
java.io.EOFException
       at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2297)
       at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2766)
       at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:797)
       at java.io.ObjectInputStream.<init>(ObjectInputStream.java:297)
       at net.sf.ehcache.store.DiskStore$1.<init>(DiskStore.java:316)
       at net.sf.ehcache.store.DiskStore.loadElementFromDiskElement(DiskStore.java:316)
       at net.sf.ehcache.store.DiskStore.expireElements(DiskStore.java:973)
       at net.sf.ehcache.store.DiskStore.throwableSafeExpireElementsIfRequired(DiskStore.java:657)
       at net.sf.ehcache.store.DiskStore.spoolAndExpiryThreadMain(DiskStore.java:645)
       at net.sf.ehcache.store.DiskStore.access$900(DiskStore.java:68)
       at net.sf.ehcache.store.DiskStore$SpoolAndExpiryThread.run(DiskStore.java:1110)

与 Hibernate 相关的 DataSource 设置如下:

hibernate {
    cache.use_second_level_cache=true
    cache.use_query_cache=true
    cache.provider_class='net.sf.ehcache.hibernate.EhCacheProvider'
}

当前的缓存设置似乎正在写入 /tmp/tomcat6-tmp/

我想完全禁用磁盘缓存,而仅缓存到内存。我该怎么做?

最佳答案

如果类路径中没有 ehcache.xml 文件,ehcache 将使用其默认设置。但如果您确实有一个(将其放在 grails-app/conf 或 src/java 中),那么将使用它。 http://ehcache.org/ehcache.xml 处的示例有详细记录。

这样的东西应该可以工作;调整未显式声明的缓存的默认缓存设置(尽管我更喜欢为了文档的缘故而创建它们)并定义具有非默认设置的任何特定缓存:

<ehcache>

   <diskStore path='java.io.tmpdir' />

   <defaultCache
      maxElementsInMemory='10000'
      eternal='false'
      timeToIdleSeconds='120'
      timeToLiveSeconds='120'
      overflowToDisk='true'
      maxElementsOnDisk='10000000'
      diskPersistent='false'
      diskExpiryThreadIntervalSeconds='120'
      memoryStoreEvictionPolicy='LRU'
   />

   <cache name='com.yourcompany.yourapp.DomainClassName'
      maxElementsInMemory='1000'
      overflowToDisk='false'
   />

   <!-- hibernate stuff -->
   <cache name='org.hibernate.cache.StandardQueryCache'
      maxElementsInMemory='50'
      eternal='false'
      timeToLiveSeconds='120'
      maxElementsOnDisk='0'
   />

   <cache name='org.hibernate.cache.UpdateTimestampsCache'
      maxElementsInMemory='5000'
      eternal='true'
      maxElementsOnDisk='0'
   />

</ehcache>

将两个 Hibernate 缓存放在那里也是一个好主意,这样可以根据需要方便地调整它们。

关于grails - Grails 中的 "Could not remove disk store entry for [Class]"- 如何禁用基于磁盘的缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4587542/

相关文章:

java - 在没有xsd的离线环境中使用ehcache

java - ehcache 在 Tomcat Docker 镜像中不工作

grails - 如何让 Spock 重试失败的 Geb 测试?

链接到自身的 Grails 表

java - 使用 IIS 7/Tomcat 连接器托管的 Grails 应用程序中的错误页面

mongodb - Grails + Mongodb + Spock:执行嵌入式字段查询时抛出NullPointerException

java - 在 Tomcat 中重新部署应用程序时发生内存泄漏

json - 在 Grails 中将映射和属性列表作为 JSON 持久化

spring-mvc - Web 缓存和 Spring WebMVC

linux - 用于验证多播网络设置的简单 ehcache 程序