首页 文章

Hibernate二级缓存不缓存已提交的实体

提问于
浏览
1

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

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

EHCache lock mode configuration in Hibernate

1 回答

  • 2

    最先进的POJO在行动书中谈到了它

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

    和...

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

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

    • Transactional:仅在托管环境中可用,如果需要,它可以保证完全事务隔离,直到可重复读取 . 在极少数情况下更新时,将此策略用于读取主要数据,这对于防止并发事务中的陈旧数据至关重要 .

    • 读写:此策略使用时间戳机制维护读提交隔离,并且仅在非聚簇环境中可用 . 同样,在极少数更新的情况下,将此策略用于读取主要数据,这对于防止并发事务中的陈旧数据至关重要 .

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

    问候,

相关问题