nonstrict-read-write
和read-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-write
和read-write
有什么区别?节点是否可能使用缓存中过时的10分钟版本?
请注意冗长的超时和异步复制。
答案 0 :(得分:16)
读写:如果两个事务试图修改数据,那么这些事务在“读提交”级别被隔离(或者可重复读取,如果数据库设置为那个) - 通常这就足够了,通常我们不需要“可序列化”的隔离级别。
Nonstrict读写:缓存根本没有锁定,所以如果两个事务修改数据,我们永远不知道我们得到了什么,我们不能保证缓存状态=数据库状态。
只有在两次交易不太可能同时修改数据时,这才是安全的。我们也需要设置适当的缓存超时。
有关详细信息和非常好的解释,请查看此处:hibernate cache strategy
答案 1 :(得分:0)
NONSTRICT_READ_WRITE:在更改受影响的数据的事务已提交后,将更新缓存。因此,不能保证强一致性,并且存在可以从高速缓存获得陈旧数据的小时间窗口。这种策略适用于能够容忍最终一致性的用例。
READ_WRITE:此策略保证了通过使用“软”锁实现的强一致性:当更新缓存实体时,软锁也存储在该实体的缓存中,这是在交易提交后发布。访问软锁定条目的所有并发事务将直接从数据库中获取相应的数据。