我想知道 Hibernate 二级缓存(我们正在使用 EHCache)是否有可能允许应用程序缓存已提交给数据库的实体,如果它知道没有其他应用程序正在修改数据库。
我的想法是,如果我更新记录 A,那么我知道记录 A 的值并且应该能够缓存它,像 Terracotta 这样的 JVM 集群系统在使用 Java 同步锁的 JVM 堆内存方面支持这种类型的行为。
我想知道 Hibernate 二级缓存(我们正在使用 EHCache)是否有可能允许应用程序缓存已提交给数据库的实体,如果它知道没有其他应用程序正在修改数据库。
我的想法是,如果我更新记录 A,那么我知道记录 A 的值并且应该能够缓存它,像 Terracotta 这样的 JVM 集群系统在使用 Java 同步锁的 JVM 堆内存方面支持这种类型的行为。
最先进的 POJO 的 in Action 书中谈到了它
如果单服务器应用程序使用持久性框架更新数据库,则该框架会更新进程级缓存。
和...
可更新的缓存对象通常应使用乐观锁定,因为这将防止应用程序盲目地覆盖数据库中的更改。AND 如果事务更新了数据库中已经更改的缓存对象,乐观锁定失败将导致事务回滚。持久性框架将从缓存中删除陈旧的数据,应用程序可以使用最新版本的数据重试事务。
并根据 JPA with Hibernate 书选择以下策略之一
添加到原始anwser:无论您使用@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE),Hibernate 都不能保证缓存和数据库之间的一致性。如果你想使用它,那么你应该配置一个足够短的过期超时,这会影响性能。
问候,