【问题标题】:Read only vs NonRestrict Read Write in Cache Concurrency in HibernateHibernate 缓存并发中的只读与非限制读写
【发布时间】:2019-09-04 15:27:10
【问题描述】:
我是 Hibernate 的初学者,在 JPA 二级缓存并发策略中遇到了这些概念:
Read-Only: Used when the cache is never updated. Data like names of countries etc are suitable candidate
Non-Strict Read-Write: Data that is rarely updated.
我很困惑这两者之间到底有什么区别。
【问题讨论】:
标签:
java
hibernate
jpa
second-level-cache
【解决方案1】:
这与频率本身无关;这是关于缓存实现可以做的优化。当级别设置为read-only 时,引擎知道您的应用不会更新实体/集合,并且可以避免一些锁定等。non-strict read-write 级别没有详细定义,但是它允许实现做另一个一种优化,可能会降低一致性。在常规read-write 模式下,缓存尝试与数据库保持精确同步;在non-strict 模式下,当缓存提供陈旧数据(数据库中不再存在的数据)时,它可以打开一个简短的窗口。好处可能是性能的提高。
如果您的更新不频繁,则出现问题的可能性很小(例如,对实体的更新会发生冲突),这就是您可以决定承担此类风险的原因。
【解决方案2】:
您将read-only 用于查询一次的缓存条目,通常在应用程序启动期间或在第一次请求时,并且可以肯定加载的结果在应用程序的生命周期内永远不会改变。就像描述中一样,国家列表就是一个很好的例子。
对于Non-Strict Read-Write,当缓存结果的更新可能偶尔更改时,您可以使用此选项。
例如商店在一周中的哪几天开张。这通常不会改变,但由于一些翻新,下周日可能会关闭,这将导致缓存更新。
这会强制对持久性提供程序进行额外的检查和同步,因此它的性能不是最高的(如read-only)。
您需要判断是否尽可能使用read-only更相关,并在字典发生罕见更改时重新启动服务器或实现Non-Strict Read-Write并处理性能稍慢但无需重新启动服务器时不时地。