Hibernate 二级缓存不缓存提交的实体
-
05-07-2019 - |
题
我想知道 Hibernate 二级缓存(我们使用 EHCache)是否可以允许应用程序缓存已提交到数据库的实体(如果它知道没有其他应用程序正在修改数据库)。
我的想法是,如果我更新记录 A,那么我就知道记录 A 的值,并且应该能够缓存该值,像 Terracotta 这样的 JVM 集群系统使用 Java 同步锁在 JVM 堆内存方面支持这种类型的行为。
解决方案
最先进的 POJO 的《in Action》一书谈到了这一点
如果单服务器应用程序使用持久性框架更新数据库,则该框架会更新进程级缓存。
和...
可更新的缓存对象通常应使用乐观锁定,因为这将防止应用程序盲目覆盖数据库中的更改。并且如果事务更新数据库中已更改的缓存对象,则乐观锁定失败将导致事务回滚。持久性框架将从缓存中删除过时的数据,并且应用程序可以使用最新版本的数据重试事务。
并根据JPA with Hibernate书籍选择以下策略之一
- 交易性:它仅在托管环境中可用,保证完整的 如果需要,事务隔离直至可重复读取。将此策略用于 主要读取数据,其中防止并发事务中的过时数据至关重要, 在极少数情况下进行更新。
- 读写:此策略使用时间戳维护已提交读隔离 机制,并且仅在非群集环境中可用。同样,对于以读取为主的数据,请使用此策略,因为在极少数更新情况下,防止并发事务中的陈旧数据至关重要。
添加到原始答案:无论您是否使用 @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE),Hibernate 都不保证缓存和数据库之间的一致性。如果您想使用它,那么您应该配置足够短的到期超时,这可能会影响性能。
问候,
不隶属于 StackOverflow