1

我想知道 Hibernate 二级缓存(我们正在使用 EHCache)是否有可能允许应用程序缓存已提交给数据库的实体,如果它知道没有其他应用程序正在修改数据库。

我的想法是,如果我更新记录 A,那么我知道记录 A 的值并且应该能够缓存它,像 Terracotta 这样的 JVM 集群系统在使用 Java 同步锁的 JVM 堆内存方面支持这种类型的行为。

Hibernate中的EHCache锁模式配置

4

1 回答 1

3

最先进的 POJO 的 in Action 书中谈到了它

如果单服务器应用程序使用持久性框架更新数据库,则该框架会更新进程级缓存。

和...

可更新的缓存对象通常应使用乐观锁定,因为这将防止应用程序盲目地覆盖数据库中的更改。AND 如果事务更新了数据库中已经更改的缓存对象,乐观锁定失败将导致事务回滚。持久性框架将从缓存中删除陈旧的数据,应用程序可以使用最新版本的数据重试事务。

并根据 JPA with Hibernate 书选择以下策略之一

  • 事务性:仅在托管环境中可用,如果需要,它保证完全事务隔离直至可重复读取。将此策略用于以读取为主的数据,在这种情况下,防止并发事务中的陈旧数据至关重要,在更新的罕见情况下。
  • 读写:此策略使用时间戳机制维护读取提交隔离,并且仅在非集群环境中可用。再次,对以读取为主的数据使用这种策略,在这种情况下,在极少数更新的情况下,防止并发事务中的陈旧数据至关重要。

添加到原始anwser:无论您使用@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE),Hibernate 都不能保证缓存和数据库之间的一致性。如果你想使用它,那么你应该配置一个足够短的过期超时,这会影响性能。

问候,

于 2009-09-12T18:00:38.757 回答