我如何决定使用哪种CacheConcurrencyStrategy
?
NonstrictReadWriteCache
,ReadOnlyCache
,ReadWriteCache
,TransactionalCache
。我读了https://www.hibernate.org/hib_docs/v3/api/org/hibernate/cache/CacheConcurrencyStrategy.html,但没有详细解释。
Hibernate documentation在定义它们方面做得非常好:
19.2.2. Strategy: read only
如果您的应用程序需要读取但不修改持久化类的实例,则可以使用只读缓存。这是最简单和最佳的执行策略。它甚至可以安全地用于集群。
19.2.3. Strategy: read/write
如果应用程序需要更新数据,则读写缓存可能是合适的。如果需要可序列化的事务隔离级别,则不应使用此缓存策略。如果在JTA环境中使用缓存,则必须指定属性
hibernate.transaction.manager_lookup_class
并命名用于获取JTATransactionManager
的策略。在其他环境中,您应确保在调用Session.close()
或Session.disconnect()
时完成事务。如果要在群集中使用此策略,则应确保底层缓存实现支持锁定。内置缓存提供程序不支持锁定。19.2.4. Strategy: nonstrict read/write
如果应用程序仅偶尔需要更新数据(即,如果两个事务极不可能同时尝试更新同一项),并且不需要严格的事务隔离,则非严格读写缓存可能是合适的。如果在JTA环境中使用缓存,则必须指定
hibernate.transaction.manager_lookup_class
。在其他环境中,您应确保在调用Session.close()
或Session.disconnect()
时完成事务。19.2.5. Strategy: transactional
事务缓存策略为完全事务缓存提供程序(如JBoss TreeCache)提供支持。这样的缓存只能在JTA环境中使用,您必须指定
hibernate.transaction.manager_lookup_class
。
换一种说法:
因此,选择正确的策略取决于数据是否正在更新的事实,更新的频率和所需的隔离级别。如果您不知道如何回答要放入缓存的数据的这些问题,可以向DBA寻求一些支持。
READ_ONLY:仅用于从不更改的实体(如果尝试更新此类实体,则抛出异常)。它非常简单和高效。非常适合一些不会改变的静态参考数据。
NONSTRICT_READ_WRITE:在已提交更改受影响数据的事务之后更新缓存。因此,不能保证强一致性,并且存在可以从高速缓存获得陈旧数据的小时间窗口。这种策略适用于能够容忍最终一致性的用例。
READ_WRITE:此策略通过使用“软”锁实现了强大的一致性:当更新缓存实体时,软锁也存储在该实体的缓存中,该锁在事务提交后释放。访问软锁定条目的所有并发事务将直接从数据库获取相应的数据。
TRANSACTIONAL:缓存更改在分布式XA事务中完成。高速缓存实体中的更改在同一XA事务中的数据库和高速缓存中提交或回滚。
阅读API文档是件好事,但你也应该阅读文档(它很棒),Second Level Cache - Strategies。
希望这清除你的怀疑!