繁体   English   中英

Infinispan JPA二级缓存默认值

[英]Infinispan JPA 2nd level cache defaults

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

为使用@Cache注释的实体自动创建缓存,我可以通过<distributed-cache-configuratoin>infinispan.xmlinfinispan.xml自定义<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>

我该怎么做这些事情?

实体的默认缓存配置名为entity

缓存配置可以针对存储在缓存中的每种类型的数据而不同。 要覆盖缓存配置模板,请使用属性hibernate.cache.infinispan.data-type.cfg ,其中data-type可以是以下之一:

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

immutable-entity实体用@Immutable注释标记或在映射文件中设置为mutable=false

naturalid@NaturalId属性索引的实体。

collection所有集合。

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

query映射查询→查询结果。

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

collectionimmutable-entitynaturalid的默认值也是为entity指定的配置,因此您不必单独配置它们(如果您当然不需要单独的配置),可以在文档源代码

注意

通常,分布式Hibernate L2缓存可能不是一个好主意,因为实体实例以二级缓存中的反汇编水合状态存储,这意味着只有关联实体的ID与父实体状态一起存储。

假设您有以下实体( ABC都是可缓存的):

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

  @OneToMany
  private Collection<C> cs;
}

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

  1. 获取实体A状态。
  2. 基于存储在b关联中的id获取实体B状态。
  3. 获取cs id的集合。
  4. 对于cs集合中的每个id,逐个获取C实体状态。

显然,如果您正在组装A实例的集合(例如,从查询的结果),则对A每个实例执行上述所有操作。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM