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

发布于 2024-08-04 03:23:43 字数 317 浏览 8 评论 0原文

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

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

Hibernate 中的 EHCache 锁定模式配置

I'm wondering if it's possible for Hibernate second level cache (we're using EHCache) to allow an application to cache an Entity that has been comitted to the DB if it knows that no other applications are modifying the DB.

My thought is that if I update record A, then I know the value of record A and should be able to cache that, JVM clustering systems like Terracotta support this type of behavior in terms of JVM heap memory using Java synchronization locks.

EHCache lock mode configuration in Hibernate

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

无人问我粥可暖 2024-08-11 03:23:43

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

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

和...

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

并根据 JPA with Hibernate book Transactional 选择以下策略之一

  • :仅在托管环境中可用,它保证完全
    如果需要,事务隔离高达可重复读取。使用此策略
    主要读取对于防止并发事务中的过时数据至关重要的数据,
    在罕见的更新情况下。
  • 读写:此策略使用时间戳来维护已提交的读隔离
    机制,并且仅在非集群环境中可用。同样,对于以读取为主的数据,请使用此策略,这对于防止并发事务中的过时数据(在罕见的更新情况下)至关重要。

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

问候,

State of the art POJO's in Action book talks about it

If a single-server application updates the database using the persistence framework, the framework updates the process-level cache.

And...

Cached objects that are updateable should typically use optimistic locking because that will prevent the application from blindly overwriting changes in the database. AND if a transaction updates a cached object that had already been changed in the database, the optimistic locking failure will cause the transaction to be rolled back. The persistence framework will remove the stale data from the cache, and the application can retry transaction with the latest version of the data.

And choose one of the following strategies according to JPA with Hibernate book

  • Transactional: available in a managed environment only, it guarantees full
    transactional isolation up to repeatable read, if required. Use this strategy for
    read-mostly data where it’s critical to prevent stale data in concurrent transactions,
    in the rare case of an update.
  • Read-write: This strategy maintains read committed isolation, using a timestamping
    mechanism and is available only in nonclustered environments. Again, use this strategy for read-mostly data where it’s critical to prevent stale data in concurrent transactions, in the rare case of an update.

Added to original anwser: Hibernate DOES NOT GUARANTEE consistency between the cache and the database whether you use @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE). If you want to use it, so you SHOULD configure a sufficiently short expiry timeout which can affect perfomance.

regards,

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文