我们在hibernate中使用infinispan作为二级缓存。这是我们大多数实体的缓存配置:
<invalidation-cache-configuration
name="entity"
mode="ASYNC">
<encoding media-type="application/x-java-object"/>
<locking concurrency-level="1000" acquire-timeout="1000"/>
<transaction mode="NONE"/>
<expiration max-idle="-1" interval="0" lifespan="-1" />
<memory max-count="2000000"/>
</invalidation-cache-configuration>
它给出了很多警告:
ISPN000025:wakeUpInterval <= 0,未启动过期的清除线程
文档中写道:
如果您使用集群缓存模式,您永远不应该禁用过期收割器。
另外,文档说有一个“触摸”命令,它同步集群中“最近访问”的元数据。
这可能会降低性能,因为“在所有触摸命令完成之前,cache.get()请求不会返回”。下一段,医生说:“最大空闲过期时间不适用于无效模式。”所以我很困惑。
我在想:
1.如果对象永远不会过期,为什么我们需要一个每分钟都在运行的reaper线程?我可以使用interval=“0”禁用它吗?
1.为什么我们需要触摸命令?我能让它失效吗?我应该至少将触摸模式设置为“ASYNC”吗?
1条答案
按热度按时间omqzjyyz1#
它给出了很多警告:
ISPN000025:wakeUpInterval <= 0,未启动过期的清除线程
这是一个信息级别的消息,低于警告。您看到很多的原因是因为它是这样配置的每个缓存打印一次消息。如果你愿意,你可以保持你的配置不变,忽略INFO消息,它们是启动时的一次性事情。
1.如果对象永远不会过期,为什么我们需要一个每分钟都在运行的reaper线程?我可以使用interval=“0”禁用它吗?
你可以的请注意,从Infinispan的Angular 来看,我们无法判断一个对象是否永远不会过期,因为我们还允许编程重写来编写可以在运行时提供过期的操作。INFO消息只是告诉用户“嘿,我们不会自动拾取过期的条目,仅限访问”
1.为什么我们需要触摸命令?我能让它失效吗?我应该至少将触摸模式设置为“ASYNC”吗?
我觉得你可能是在合并部分。触摸命令 * 仅 * 在使用最大空闲过期时使用,寿命过期不使用触摸命令。触摸命令不用于您的用例,没有过期。
由于在一个节点上完成读取时,其他所有者不会知道已经完成,因此我们必须发送这些触摸命令来告诉其他所有者节点,因此他们不会认为条目实际上已经过期。
下一段,医生说:“最大空闲过期时间不适用于无效模式。”
无效缓存的最大空闲不起作用,因为它破坏了无效缓存的主要好处。通常,应用程序在同一个事务中更新DB并使该高速缓存无效,因此通常不需要最大空闲。在每次读取时,最大空闲线程必须向集群中的所有节点发送一个触摸命令,这增加了开销。
非集群最大空闲可以与无效缓存一起工作,但这没有请求afaik。如果你愿意,你也可以在https://issues.redhat.com/browse/ISPN上创建一个新功能。