我正在尝试将Infinispan配置为休眠二级缓存。一切都很好,但是我想调整默认配置,即所有缓存共享的值。
缓存是用于注明实体自动创建的@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>
我该怎么做?
实体的默认缓存配置名为entity
:
对于缓存中存储的每种数据,缓存配置可能有所不同。为了覆盖缓存配置模板,请使用属性
hibernate.cache.infinispan.data- type.cfg
where,data-type
可以是以下之一:
entity
由@Id
或@EmbeddedId
属性建立索引的实体。
immutable-entity
带有@Immutable
注释标签或设置为mutable=false
映射文件中的实体。
naturalid
按其@NaturalId
属性索引的实体。
collection
所有收藏。
timestamps
映射实体类型→上次修改时间戳。用于查询缓存。
query
映射查询→查询结果。
pending-puts
使用失效模式缓存的区域的辅助缓存。
默认的collection
,immutable- entity
并且naturalid
也是指定的配置entity
,这样你就不必单独配置它们(如果你不想当然单独配置),因为可以在中看到文档和源代码。
注意
通常,使Hibernate L2缓存分布式可能不是一个好主意,因为实体实例以反汇编的水合状态存储在L2缓存中,这意味着仅关联实体的ID与父实体状态一起存储。
假设你有以下实体(A
,B
,C
都是超高速缓存):
@Entity
public class A {
@ManyToOne
private B b;
@OneToMany
private Collection<C> cs;
}
即使该cs
集合也是可A
缓存的,也要从缓存中完全组装一个实体实例,您将需要以下网络往返于群集的其他节点:
A
状态。B
根据b
关联中存储的ID 获取实体状态。cs
ID 的集合。cs
集合中的每个ID C
,一一读取实体状态。显然,如果您要组装A
实例的集合(例如,根据查询结果),则对的每个实例都执行上述所有操作A
。
所有这些都意味着,直接从数据库中读取数据(例如,通过适当配置的延迟加载,例如使用批处理大小),可以比分布式缓存中的所有网络往返高效得多。
同样,这也是实体/集合缓存应在失效集群模式下运行的原因之一(数据仅在读取/写入数据的节点上缓存,而在更改时在其他节点上无效)。
问题内容: Hibernate使用的默认缓存的名称是什么?甚至有默认的缓存,还是必须添加缓存提供程序才能利用缓存? 我以为是EHCache,但我认为必须对其进行配置…默认情况下它不是“那里” … 问题答案: Hibernate已经通过持久上下文提供了一种称为 一级缓存 的缓存机制。它在 Session作用域内,默认情况下处于启用状态,无法关闭。 诸如EHCache之类的缓存提供程序提供了另一种称为
问题内容: 在编写RESTful Web服务时,如果在客户端(当前是.NET胖客户端)上启用任何类型的缓存,则会遇到问题。默认情况下,Jersey不发送任何类型的缓存控制标头,因此客户端将自动缓存大多数页面(这似乎是有效的行为)。 我希望默认情况下,Jersey发送“ no-cache”的缓存控件,然后特别是响应将覆盖该缓存控件。 有没有办法用泽西岛做到这一点? 我发现RESTeasy可以使用@N
当你使用本地(在内存中)缓存时,服务器可以缓存一些信息并快速地检索它,但是其他服务器不能访问这个缓存数据,他们需要到数据库中查询同样的信息。 如果你喜欢使用分布式缓存让其他服务器访问缓存的数据,由于它有一些序列化/反序列化和网络延迟开销,则需要注意:在某些情况下,它可能会降低性能。 缓存需要处理的另一个问题:缓存失效。 There are only two hard things in Compu
1、一级缓存:指的是mybatis中sqlSession对象的缓存,当我们执行查询以后,查询的结果会同时存入sqlSession中,再次查询的时候,先去sqlSession中查询,有的话直接拿出,当sqlSession消失时,mybatis的一级缓存也就消失了,当调用sqlSession的修改、添加、删除、commit()、close()等方法时,会清空一级缓存。 2、二级缓存:指的是mybati
分级缓存可提升后端存储内某些(热点)数据的 I/O 性能。分级缓存需创建一个由高速而昂贵存储设备(如 SSD )组成的存储池、作为缓存层,以及一个相对低速/廉价设备组成的后端存储池(或纠删码编码的)、作为经济存储层。 Ceph 的对象处理器决定往哪里存储对象,分级代理决定何时把缓存内的对象刷回后端存储层;所以缓存层和后端存储层对 Ceph 客户端来说是完全透明的。 缓存层代理自动处理缓存层和后端存
问题内容: 我想在hibernate项目中使用二级缓存,但是我只对hibernate二级缓存了解一点,任何人都可以解释我应该如何在代码中使用它以及需要什么配置和.jar文件吗?我将这些设置设置为我的hibernate.cfg.xml文件 并添加这些jar文件, 我想知道我是否需要更改其他配置? 我怎么知道我的项目使用二级缓存? 如果只是设置此设置,hibernate将自动使用此设置,否则我必须在我