Hibernate 缓存并发中的只读与非限制读写

Read only vs NonRestrict Read Write in Cache Concurrency in Hibernate

我是 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.

我很困惑这两者到底有什么区别。

您使用 read-only 用于只查询一次的缓存条目,通常是在应用程序启动期间或第一次请求时,并且可以肯定加载的结果在应用程序的生命周期内永远不会改变.就像描述中的国家列表就是一个很好的例子。

对于 Non-Strict Read-Write,当缓存结果的更新偶尔会发生变化时,您可以使用此选项。

例如商店在一周中的哪几天开张。这通常不会改变,但由于下周日的一些装修可能会关闭,这将导致缓存更新。

这会在持久性提供程序上强制执行额外的检查和同步,因此其性能不是最高的(如 read-only)。

您需要判断是否尽可能使用 read-only 并在字典发生罕见更改时重新启动服务器或实施 Non-Strict Read-Write 并处理性能稍慢的问题但不需要时不时重启服务器。

这与频率本身无关;它是关于缓存实现可以做的优化。当级别设置为 read-only 时,引擎知道您的应用不会更新 entity/collection,并且可以避免一些锁定等。 non-strict read-write 级别没有详细定义,但是它允许实现进行另一种优化,可能会降低一致性。在常规 read-write 模式下,缓存会尝试与数据库保持精确同步;在 non-strict 模式下,它可以打开一个简短的 window 当缓存提供陈旧数据(不再在数据库中的东西)时。好处可能是提高性能。

如果您的更新不频繁,则出现问题的可能性很小(例如,对实体的更新会发生冲突),这就是您决定冒这样的风险的原因。