带 ehcache 的群集休眠缓存:非严格读写与严格读写

和 之间的真正区别是什么?我可以阅读ehcache和Hibernate文档,但据我所知,它们只说“如果你做更新,读写会更好”。我发现它不能令人满意。nonstrict-read-writeread-write

我可能有一个问题,长期缓存集合配置如下:

<cache name="trx.domain.Parent.children" maxElementsInMemory="5000"
    eternal="false" overflowToDisk="false" timeToIdleSeconds="1200"
    timeToLiveSeconds="1800">
    <cacheEventListenerFactory
        class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"
        properties="replicateAsynchronously=true, replicatePuts=true, replicateUpdates=true, replicateUpdatesViaCopy=false, replicateRemovals=true" />

<set name="children" lazy="false" inverse="true">
    <cache usage="nonstrict-read-write"/>
    <key column="callout_id" />
    <one-to-many class="Child" />
</set>

更新集合时,在发生更新的节点上以及其他节点上,究竟会发生什么情况?和 这里有什么区别?节点是否有可能从缓存中使用其过时的 10 分钟版本?nonstrict-read-writeread-write

请注意冗长的超时和异步复制。


答案 1

读写:如果两个事务尝试修改数据,那么这些事务在“读取提交”级别(或可重复读取,如果数据库设置为该级别)被隔离 - 通常这就足够了,通常我们不需要“可序列化”隔离级别。

非限制读写:缓存根本没有锁定,所以如果两个事务修改了数据,我们永远不知道我们得到了什么,我们不能保证缓存状态=数据库状态。

只有当两个事务不太可能同时修改数据时,这才是安全的。我们还需要设置适当的缓存超时。

有关更多详细信息和非常好的解释,请查看此处:休眠缓存策略


答案 2

NONSTRICT_READ_WRITE:在提交更改受影响数据的事务后,将更新缓存。因此,不能保证强一致性,并且存在一个可以从缓存中获取过时数据的时间窗口。这种策略适用于可以容忍最终一致性的用例。

READ_WRITE:此策略保证了通过使用“软”锁实现的强一致性:当更新缓存的实体时,软锁也会存储在该实体的缓存中,该软锁在提交事务后释放。所有访问软锁定条目的并发事务都将直接从数据库获取相应的数据。


推荐