我正在尝试将Infinispan配置为hibernate二级缓存。一切都很好,但我想调整默认配置,即所有缓存共享的值。
为使用@Cache
注释的实体自动创建缓存,我可以通过infinispan.xml
在<distributed-cache-configuratoin>
中逐个自定义它们。但是,我希望所有这些缓存都有默认值(例如驱逐策略)。
另一件事是,我想将所有这些生成的缓存标记为“分布式”(默认情况下它们是“本地”)。
这是我的qazxsw poi的摘录:
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>
命名为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
,collection
和immutable-entity
的默认值也是为naturalid
指定的配置,因此您不必单独配置它们(如果您不需要单独的配置),如entity
和documentation中所示。
注意
通常,分发Hibernate L2缓存可能不是一个好主意,因为实体实例存储在L2缓存中的source code中,这意味着只有关联实体的id与父实体状态一起存储。
假设您有以下实体(disassembled hydrated state,A
,B
都可以缓存):
C
即使@Entity
public class A {
@ManyToOne
private B b;
@OneToMany
private Collection<C> cs;
}
集合也可以缓存,要从缓存中完全组装实体cs
实例,您将有以下网络往返于集群的其他节点:
A
状态。A
关联中的id获取实体B
状态。b
ID的集合。cs
集合中的每个id,逐个获取cs
实体状态。显然,如果你正在组装C
实例的集合(例如,从查询的结果),则对A
的每个实例执行上述所有操作。
这一切都意味着直接从数据库中读取数据(使用正确配置的延迟加载,例如使用A
),可能比分布式缓存中的所有网络往返更有效。
此外,这也是实体/集合缓存应在失效集群模式下运行的原因之一(数据仅缓存在读取/写入它的节点上,但在更改时在其他节点上无效)。