Hibernate和EHCache:maxElementsInMemory是如何工作的?

17
我已经配置了默认缓存(用于元素)、标准查询缓存(用于查询)和更新时间戳缓存(我认为是用于跟踪数据库更新...但我不是很确定它实际上是做什么的)EHCache。
我已经为这些缓存中的每一个设置了maxElementsInMemory,但我不知道这个数字对StandardQueryCache和UpdateTimestampsCache控制什么。我知道在默认缓存中可以缓存的实体数量不能超过10000,但查询缓存不会缓存元素,它缓存主键(就我所理解的而言)。
那么这是否意味着StandardQueryCache的maxElementsInMemory控制结果的“行”数,还是控制其可能具有的元素的主键对的数量?
UpdateTimestampsCache又如何呢?它跟踪实体上次更新的时间、表上次更新的时间还是其他什么?我应该为此使用什么maxElementsInMemory数字?
谢谢!
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ehcache.xsd" updateCheck="true" monitoring="autodetect"     dynamicConfig="true">
  <defaultCache 
    maxElementsInMemory="10000"
    eternal="false"
    timeToIdleSeconds="3600"
    timeToLiveSeconds="3600">
  </defaultCache>

  <cache
    name="org.hibernate.cache.internal.StandardQueryCache"
    maxElementsInMemory="10000"
    eternal="false"
    timeToIdleSeconds="3600"
    timeToLiveSeconds="3600">
  </cache>

  <cache
    name="org.hibernate.cache.spi.UpdateTimestampsCache"
    maxElementsInMemory="10000"
    eternal="true">
  </cache>

</ehcache>
1个回答

25

对于查询缓存,每个查询结果都是标准查询缓存区域中的一个条目。因此,您当前设置的缓存是在默认/未命名区域中缓存10000个不同的查询结果。设置使用命名区域(Query#setCacheRegion)的查询会写入一个不同的缓存区域。

这些结果需要在基础数据更改时进行“作废”。这就是UpdateTimestampsCache的目的。当Hibernate写入表时,它会将条目写入UpdateTimestampsCache(只有在启用查询缓存时才会启用此过程,因为它明确地是使这些缓存查询结果无效的一部分)。在读取缓存的查询结果时,我们会将查询结果缓存的时间戳与它所使用的所有表的时间戳进行比较,以确定结果是否仍然有效。最好不要限制此区域,如果可以的话。如果需要,最好使用底层领域模型中的表数。否则,可能会在不必要的情况下开始使缓存的查询结果无效。虽然很难想象您拥有10000个表,所以在这方面您可能还好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接