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

时间:2011-02-22 14:49:23

标签: java hibernate ehcache distributed-caching

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

我可能遇到像这样配置的长期缓存集合的问题:

<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 个答案:

答案 0 :(得分:16)

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

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

只有在两次交易不太可能同时修改数据时,这才是安全的。我们也需要设置适当的缓存超时。

有关详细信息和非常好的解释,请查看此处:hibernate cache strategy

答案 1 :(得分:0)

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

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