当前位置: 首页 > 面试题库 >

Infinispan JPA 2级缓存默认值

白芷阳
2023-03-14
问题内容

我正在尝试将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.cfgwhere,data-type 可以是以下之一:

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

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

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

collection 所有收藏。

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

query 映射查询→查询结果。

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

默认的collectionimmutable- entity并且naturalid也是指定的配置entity,这样你就不必单独配置它们(如果你不想当然单独配置),因为可以在中看到文档和源代码

注意

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

假设你有以下实体(ABC都是超高速缓存):

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

  @OneToMany
  private Collection<C> cs;
}

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

  1. 获取实体A状态。
  2. B根据b关联中存储的ID 获取实体状态。
  3. 获取csID 的集合。
  4. 对于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将自动使用此设置,否则我必须在我