Infinispan JPA二级缓存默认值

时间:2016-02-16 14:31:09

标签: java hibernate jpa infinispan second-level-cache

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

为使用@Cache注释的实体自动创建缓存,我可以在infinispan.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>

我该如何做这些事?

1 个答案:

答案 0 :(得分:6)

实体的default cache configuration名为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指定的配置,因此您无需单独配置它们(如果您不是t当然需要单独的配置),如documentationsource code中所示。

注意

通常,分发Hibernate L2缓存可能不是一个好主意,因为实体实例存储在L2缓存中的disassembled hydrated state中,这意味着只有关联实体的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实体状态。
  5. 显然,如果您正在汇编A个实例的集合(例如,来自查询的结果),则会对A的每个实例执行以上所有操作。

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

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