Hibernate缓存策略
-
11-09-2019 - |
题
我如何决定哪个 CacheConcurrencyStrategy
使用?
NonstrictReadWriteCache
,ReadOnlyCache
,ReadWriteCache
,TransactionalCache
.
我读 https://www.hibernate.org/hib_docs/v3/api/org/hibernate/cache/CacheConcurrencyStrategy.html, ,但解释得不够详细。
解决方案
这 休眠文档 在定义它们方面做得非常好:
19.2.2。战略:只读
如果您的应用程序需要阅读但不修改,则可以使用持续类的实例,则可以使用仅读取的缓存。这是最简单和最佳的 执行策略。它甚至是安全的 用于群集。
19.2.3。战略:读/写
如果应用程序需要更新 data,读写缓存可能是 适当。此缓存策略 如果可序列化,则不应使用 事务隔离级别为 必填。如果缓存在 JTA 环境,您必须指定 财产
hibernate.transaction.manager_lookup_class
并命名获取 JTA协会TransactionManager
. 。在其他 环境中,您应确保 交易完成时Session.close()
或者Session.disconnect()
叫做。如果你 想要在 集群,则应确保 底层缓存实现 支持锁定。内置缓存 提供程序不支持锁定。19.2.4。战略:非严格读/写
如果只是偶尔申请 需要更新数据(即如果是 极不可能是两个 事务将尝试更新 同时进行相同的项目),并严格 不需要事务隔离, 非严格读写缓存可能是 适当。如果缓存在 JTA 环境,必须指定
hibernate.transaction.manager_lookup_class
。在其他环境中,您应该 确保交易是 完成时间Session.close()
或者Session.disconnect()
叫做。19.2.5。战略:交易性的
事务性缓存策略 提供对 事务性缓存提供程序,例如 JBoss 树缓存。这样的缓存只能 在 JTA 环境中使用,并且您 必须指定
hibernate.transaction.manager_lookup_class
.
换句话说:
只读: 对于数据有用的是 经常阅读但从未更新 (例如。参考数据,如国家)。很简单。它具有所有性能中最好的(显然)。
读/写: 如果您的数据需要,这是理想的选择 要被更新. 。但它没有提供 可串行化 隔离级别, 幻读 可能会发生(您可能会在交易结束时看到一些在开始时不存在的东西)。它比只读的开销更多。
非严格读/写: 或者,如果两个单独的事务线程不太可能更新同一对象,则可以使用非严格读写策略。它的开销比读写要少。这对于以下数据很有用 很少更新.
交易性: 如果您需要一个 完全交易性 缓存。仅适用于 JTA 环境。
因此,选择正确的策略取决于数据是否更新、更新的频率以及所需的隔离级别。如果您不知道如何回答这些关于要放入缓存的数据的问题,也许可以寻求 DBA 的支持。
其他提示
只读: 仅用于永不更改的实体(如果尝试更新此类实体,则会引发异常)。它非常简单且高性能。非常适合一些不会变化的静态参考数据。
非严格_读_写: 提交更改受影响数据的事务后,缓存将被更新。因此,无法保证强一致性,并且存在一个很小的时间窗口,在该时间窗口内可能会从缓存中获取陈旧数据。这种策略适合能够容忍最终一致性的用例。
读_写: 该策略通过使用“软”锁来保证强一致性:当更新缓存的实体时,该实体的软锁也会存储在缓存中,并在事务提交后释放。所有访问软锁定条目的并发事务都将直接从数据库获取相应的数据。
交易: 缓存更改在分布式 XA 事务中完成。缓存实体中的更改在同一 XA 事务中的数据库和缓存中提交或回滚。
阅读 API 文档是件好事,但你也应该阅读文档(它很棒), 二级缓存 - 策略.
事务性 - 对于主要读取的数据使用此策略,在极少数更新情况下,防止并发事务中的陈旧数据至关重要。
读-写- 再次对主要读取的数据使用此策略,在极少数更新情况下,防止并发事务中的陈旧数据至关重要。
非严格读写- 此策略不保证缓存和数据库之间的一致性。如果数据几乎不发生变化并且过时数据的可能性很小也不是关键问题,则可以使用此策略。
只读 - 适用于永远不会改变的数据的并发策略。仅将其用作参考数据。
希望这能消除您的疑虑!