Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 淘气的背影_Hibernate_Spring Boot_Spring Data Jpa_Ehcache - Fatal编程技术网

Hibernate 淘气的背影

Hibernate 淘气的背影,hibernate,spring-boot,spring-data-jpa,ehcache,Hibernate,Spring Boot,Spring Data Jpa,Ehcache,当我的Spring Boot+Data JPA 1.5应用程序处于重载状态时,在这种情况下几分钟后,存储库保存会停止20-30秒,因为其磁盘假脱机已满: "pool-2-thread-1" sleeping[0x00007fc1a95ae000] java.lang.Thread.State: TIMED_WAITING (sleeping) at java.lang.Thread.sleep at ehcache.Cache.backOffIfDiskSpoolFull

当我的Spring Boot+Data JPA 1.5应用程序处于重载状态时,在这种情况下几分钟后,存储库保存会停止20-30秒,因为其磁盘假脱机已满:

"pool-2-thread-1" sleeping[0x00007fc1a95ae000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
    at java.lang.Thread.sleep
    at ehcache.Cache.backOffIfDiskSpoolFull
    at ehcache.Cache.putInternal
    at ehcache.Cache.put
    at ehcache.Cache.put
    ... many Hibernate, Spring, Sun frames
    at com.sun.proxy.$Proxy155.save
修剪后的net.sf。为了清晰起见,请从ehcache

结果,演出一落千丈,这让我很难过

我没有定义ehcache.xml;我只添加了hibernate ehcache依赖项,并通过@EnableCaching注释启用了缓存。尽管没有提供ehcache.xml,但Hibernate仍在使用ehcache,如上面的stacktrace所示


我想将EhCache重新配置为不使用,而是通过Spring引导、Spring数据、Hibernate等实现它现在所做的所有其他功能。。为了避免试图重新创建现在明显存在的有效/神奇的ehcache.xml,是否有一个ehcache bean,我可以在其中禁用持久性,或者类似的东西?或者,是否有某种方法可以打印有效的Ehcache配置?

磁盘存储在Ehcache配置中定义。它位于ehcache.xml中

因此,从ehcache.xml中删除磁盘存储是一种可行的方法

从您添加的解释来看:Hibernate试图对您友好,并使用默认参数创建缓存。但是使用这些参数是一个非常糟糕的主意

您需要在缓存配置中考虑一些问题

它应该容纳多少元素? 它们应该过期吗? 我需要磁盘吗?大多数情况下,这里的答案确实是否定的 如果不这样做,最终会出现过时数据或OutOfMemoryErrors


因此,我强烈建议您使用自己经过深思熟虑的ehcache.xml,而不是Hibernate magic。

Spring Boot 1.5和Spring数据JPA使用Hibernate 5.0.12.Final;并且,Hibernate 5.0.12.1最终在内部使用。要禁用磁盘写入,您需要在Hibernate使用的默认缓存配置中禁用磁盘,并在任何应用程序定义的缓存中禁用磁盘使用,例如:

<?xml version="1.0" encoding="UTF-8"?>
<ehcache>
  <defaultCache
      maxElementsInMemory="10000"
      eternal="false"
      timeToIdleSeconds="120"
      timeToLiveSeconds="120"
      overflowToDisk="false"
      maxElementsOnDisk="0"
      diskPersistent="false"
      diskExpiryThreadIntervalSeconds="120"
      memoryStoreEvictionPolicy="LRU"
      />

  <cache name="my-cache-1" />
  ...
  <cache name="my-cache-n" />
</ehcache>

谢谢,@Henri-有没有什么方法可以显示有效的配置,这样我就不会失去魔法…?我不明白你的意思。什么魔法?有效的配置应该是ehcache.xml,除非你在运行时添加新的缓存;如上所述,我对EhCache还不够熟悉,但我认为可以通过java配置创建缓存并自己连接缓存管理器。但就个人而言,一点XML更易于维护