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

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

Hibernate中EHCache锁模式配置

有帮助吗?

解决方案

最先进的 POJO 的《in Action》一书谈到了这一点

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

和...

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

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

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

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

问候,

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top