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

时间:2009-09-09 19:17:40

标签: hibernate caching ehcache second-level-cache

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

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

EHCache lock mode configuration in Hibernate

1 个答案:

答案 0 :(得分:2)

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

  

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

和...

  

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

根据JPA with Hibernate book

选择以下策略之一
  • 交易:仅在托管环境中提供,它保证已满 如果需要,事务隔离可重复读取。使用此策略 读取主要数据,其中防止并发事务中的陈旧数据至关重要, 在极少数情况下更新。
  • 读写:此策略使用时间戳保持读取提交的隔离 机制,仅在非集群环境中可用。同样,在极少数更新的情况下,将此策略用于读取主要数据,这对于防止并发事务中的陈旧数据至关重要。

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

的问候,