休眠缓存策略
如何决定使用哪种?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. 策略:只读
如果应用程序需要读取(但不需要修改)持久性类的实例,则可以使用只读缓存。这是最简单和最佳性能的策略。它甚至可以安全地用于群集。
策略:读/写
如果应用程序需要更新数据,则读写缓存可能适用。如果需要可序列化的事务隔离级别,则永远不应使用此缓存策略。如果在 JTA 环境中使用高速缓存,那么必须指定属性并命名用于获取 JTA 的策略。在其他环境中,应确保事务在调用 或 时完成。如果要在群集中使用此策略,则应确保底层缓存实现支持锁定。内置缓存提供程序不支持锁定。
hibernate.transaction.manager_lookup_class
TransactionManager
Session.close()
Session.disconnect()
策略:非严格读/写
如果应用程序只是偶尔需要更新数据(即,如果两个事务极不可能同时尝试更新同一项),并且不需要严格的事务隔离,则非收缩读写缓存可能是合适的。如果在 JTA 环境中使用高速缓存,那么必须指定 。在其他环境中,应确保事务在调用 或 时完成。
hibernate.transaction.manager_lookup_class
Session.close()
Session.disconnect()
策略:交易性
事务性缓存策略为完全事务性缓存提供程序(如 JBoss TreeCache)提供支持。这样的高速缓存只能在 JTA 环境中使用,您必须指定 。
hibernate.transaction.manager_lookup_class
换句话说:
只读:对于经常读取但从不更新的数据(例如,国家/地区等参考数据)很有用。这很简单。它具有所有性能中最好的(显然)。
读/写:如果数据需要更新,则可取。但它不提供可序列化的隔离级别,可能会发生幻像读取(您可能会在事务结束时看到一些开始时不存在的东西)。它的开销比只读的开销更多。
非严格读/写:或者,如果两个单独的事务线程不太可能更新同一对象,则可以使用非限制读写策略。它的开销比读写要少。这对于很少更新的数据很有用。
事务:如果需要完全事务性缓存。仅适用于 JTA 环境。
因此,选择正确的策略取决于数据是否正在更新的事实、更新的频率和所需的隔离级别。如果您不知道如何回答要放入缓存中的数据的这些问题,请向DBA寻求一些支持。
READ_ONLY:仅用于永不更改的实体(如果尝试更新此类实体,则会引发异常)。它非常简单且性能高。非常适合一些不会更改的静态参考数据。
NONSTRICT_READ_WRITE:在提交更改受影响数据的事务后,将更新缓存。因此,不能保证强一致性,并且存在一个可以从缓存中获取过时数据的时间窗口。这种策略适用于可以容忍最终一致性的用例。
READ_WRITE:此策略保证了通过使用“软”锁实现的强一致性:当更新缓存的实体时,软锁也会存储在该实体的缓存中,该软锁在提交事务后释放。所有访问软锁定条目的并发事务都将直接从数据库获取相应的数据。
事务:缓存更改是在分布式 XA 事务中完成的。缓存实体中的更改将在同一 XA 事务中提交或回滚数据库和缓存。