Infinispan JPA 二级缓存默认值

2023-12-11

我正在尝试将 Infinispan 配置为休眠二级缓存。一切都很好,但我想调整默认配置,即所有缓存共享的值。

会自动为带有注释的实体创建缓存@Cache,我可以在其中一一定制infinispan.xml by <distributed-cache-configuratoin>。但是,我希望所有这些缓存都有默认值(例如逐出策略)。

另一件事是,我想将所有这些生成的缓存标记为“分布式”(默认情况下它们是“本地”)。

这是我的摘录infinispan.xml:

<cache-container default-cache="default" statistics="true">
    <transport stack="external-file" />
    <!-- Configuring specifics for the User entity. How to do it globally? -->
    <distributed-cache-configuration name="user" statistics="true" />
</cache-container>

我该如何做这些事情?


The 默认缓存配置对于实体被命名entity:

对于存储在其中的每种数据类型,缓存配置可能有所不同 缓存。为了覆盖缓存配置模板,请使用 财产hibernate.cache.infinispan.data-type.cfg where data-type可以是以下之一:

entity实体索引@Id or @EmbeddedId属性。

immutable-entity带有标签的实体@Immutable注释或设置 作为mutable=false在映射文件中。

naturalid按其索引的实体@NaturalId属性。

collection所有收藏。

timestamps映射实体类型 → 最后修改时间戳。用过的 用于查询缓存。

query映射查询→查询结果。

pending-puts使用失效模式的区域的辅助缓存 缓存。

默认为collection, immutable-entity and naturalid也是指定的配置entity,因此您不必单独配置它们(当然,如果您不想单独配置),如中所示文档源代码.

Note

一般来说,使 Hibernate L2 缓存分布式可能不是一个好主意,因为实体实例存储在分解水合状态在 L2 缓存中,这意味着只有关联实体的 ID 与父实体状态存储在一起。

假设您有以下实体(A, B, C都是可缓存的):

@Entity
public class A {
  @ManyToOne
  private B b;

  @OneToMany
  private Collection<C> cs;
}

即使cs集合也可以缓存,以完全组装一个实体A从缓存中的实例,您将有以下到集群其他节点的网络往返:

  1. 获取实体A state.
  2. 获取实体B状态基于存储在b协会。
  3. 获取集合cs ids.
  4. 对于中的每个 idcs集合,获取C实体状态,一一对应。

显然,如果你正在组装A实例(例如,来自查询结果),以上所有内容都会针对每个实例执行A.

这一切都意味着直接从数据库读取数据(通过正确配置的延迟加载,使用批量大小例如),可能比分布式缓存中的所有网络往返更有效。

此外,这也是实体/集合缓存应在失效集群模式下运行的原因之一(数据仅缓存在读/写数据的节点上,但在更改时在其他节点上失效)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Infinispan JPA 二级缓存默认值 的相关文章

随机推荐