使用ehcache的集群化hibernate缓存:非严格读写 vs 严格读写

15

“nonstrict-read-write” 和 “read-write” 之间的真正区别是什么?我可以阅读 ehcache 和 Hibernate 文档,但据我所见,它们只是说“如果您执行更新,则 read-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>

当集合被更新时,在发生更新的节点和其他节点上会发生什么?在此处nonstrict-read-writeread-write之间有何区别?某个节点是否可能使用其缓存中已过期的10分钟版本?

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

2个回答

19

读写:如果两个事务试图修改数据,则这些事务在“读提交”级别上隔离(如果数据库设置为重复读,则为可重复读)-通常这已经足够了,通常我们不需要“可串行化”隔离级别。

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

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

有关详细信息和非常好的解释,请参见:Hibernate缓存策略


3

NONSTRICT_READ_WRITE:当改变了数据的事务被提交后,缓存才会被更新。因此,无法保证强一致性,存在一个小的时间窗口,在这个时间窗口中,可能会从缓存中获取到陈旧的数据。这种策略适用于可以容忍最终一致性的使用情况。

READ_WRITE:这种策略通过使用“软”锁来实现强一致性:当缓存实体被更新时,相应的实体上会存储一个软锁,该锁在事务提交后释放。所有并发事务访问软加锁条目的同时,将直接从数据库中获取相应的数据。


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