我如何决定CacheConcurrencyStrategy
使用哪个?
NonstrictReadWriteCache
,ReadOnlyCache
,ReadWriteCache
,TransactionalCache
.
我阅读了https://www.hibernate.org/hib_docs/v3/api/org/hibernate/cache/CacheConcurrencyStrategy.html,但解释得不够详细。
我如何决定CacheConcurrencyStrategy
使用哪个?
NonstrictReadWriteCache
,ReadOnlyCache
,ReadWriteCache
,TransactionalCache
.我阅读了https://www.hibernate.org/hib_docs/v3/api/org/hibernate/cache/CacheConcurrencyStrategy.html,但解释得不够详细。
Hibernate 文档在定义它们方面做得很好:
19.2.2. 策略:只读
如果您的应用程序需要读取而不是修改持久类的实例,则可以使用只读缓存。这是最简单和最佳的执行策略。在集群中使用它甚至是安全的。
19.2.3. 策略:读/写
如果应用程序需要更新数据,读写缓存可能是合适的。如果需要可序列化的事务隔离级别,则永远不应使用此缓存策略。如果在 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 TreeCache。这种缓存只能在 JTA 环境中使用,您必须指定
hibernate.transaction.manager_lookup_class
.
换句话说:
只读:适用于经常读取但从未更新的数据(例如国家/地区等参考数据)。很简单。它具有所有(显然)最好的性能。
读/写:如果您的数据需要更新,则可取。但它不提供SERIALIZABLE隔离级别,可能会发生幻读(您可能会在事务结束时看到开始时不存在的东西)。它比只读有更多的开销。
非严格读/写:或者,如果两个单独的事务线程不太可能更新同一个对象,您可以使用非严格读/写策略。它的开销比读写少。这对于很少更新的数据很有用。
事务性:如果您需要完全事务性缓存。仅适用于 JTA 环境。
因此,选择正确的策略取决于数据是否正在更新、更新频率和所需的隔离级别。如果您不知道如何为要放入缓存的数据回答这些问题,可以向 DBA 寻求一些支持。
READ_ONLY:仅用于从不更改的实体(如果尝试更新此类实体,则会引发异常)。它非常简单且高效。非常适合一些不变的静态参考数据。
NONSTRICT_READ_WRITE:在提交更改受影响数据的事务后更新缓存。因此,不能保证强一致性,并且有一个小的时间窗口可以从缓存中获取陈旧的数据。这种策略适用于可以容忍最终一致性的用例。
READ_WRITE:此策略通过使用“软”锁来保证强一致性:当更新缓存的实体时,该实体的缓存中也会存储一个软锁,该软锁在事务提交后释放。所有访问软锁定条目的并发事务都将直接从数据库中获取相应的数据。
TRANSACTIONAL:缓存更改在分布式 XA 事务中完成。缓存实体中的更改在同一个 XA 事务中的数据库和缓存中提交或回滚。
阅读 API 文档是一件好事,但您还应该阅读文档(它很棒),Second Level Cache - Strategies。
Transactional - 将此策略用于以读取为主的数据,在这种情况下,在极少数更新的情况下,防止并发事务中的陈旧数据至关重要。
Read-write - 再次将此策略用于以读取为主的数据,在这种情况下,在极少数更新的情况下,防止并发事务中的陈旧数据至关重要。
Nonstrict-read-write - 此策略无法保证缓存和数据库之间的一致性。如果数据几乎从未更改并且过时数据的可能性很小不是关键问题,则使用此策略。
只读 - 适用于数据的并发策略,永远不会改变。仅将其用作参考数据。
希望这可以消除您的疑问!