当前位置: 首页 > 知识库问答 >
问题:

集群环境中的Hibernate一级缓存

司马作人
2023-03-14

hibernate中的一级缓存维护在会话对象上,并且在同一JVM的边界内。它是hibernate使用的强制缓存。我担心的是如何在集群环境中管理it。多个节点将拥有自己的一级缓存(等于会话数)。在单个JVM中,一个实体可以是不同会话的一部分,但事务管理器、乐观锁定可以处理这种情况。。。。但是,我们将如何在集群环境中管理it

1)一个实体可以在两个不同节点的一级缓存中被修改,导致数据过时、数据丢失等问题。

2) 如果我们使用乐观锁定。。。。这将很难恢复事务,而且可能会影响其他节点上的其他有用事务。

3) 我们不能对每个事务都使用悲观锁。这将破坏hibernate缓存的可用性。

4)隔离级别的设置也不起作用,因为事务管理是由Hibernate应用程序本身完成的,并且事务管理的边界是一个JVM。

共有2个答案

艾望
2023-03-14

一级缓存不会产生过时的数据,我一直在集群环境中使用JPA Hibernate,没有任何相关问题。重要的是事务的隔离级别。如果您不希望其他节点读取未限制的数据,请确保您至少使用read\u Committed级别。

谷梁楚青
2023-03-14

您的第一条语句不正确,hibernate中的一级缓存不维护在同一JVM的边界内。它维护在Hibernate会话的边界内。

Hibernate单独处理会话(会话中的实体,这是一级缓存),即使在同一个jvm中,也可以在一个jvm中有多个Hibernate会话。

关于集群中不同节点上的不同一级缓存中的实体的问题与在同一jvm上的两个会话中这些实体发生了什么相同。

可能您没有收到错误,但如果节点不同,则不是无错误安排。事务管理由hibernate应用程序本身完成。它不使用数据库事务管理(悲观锁定的情况除外)。隔离级别的边界是单个JVM。

hibernate中的事务管理直接映射到DB事务,“hibernate事务启动”仅通过调用“DB事务启动”(通过JDBC或JTA)来标记。关于隔离级别,这与jvm无关,也不受其约束。

你的另一个问题

你不能在不同的节点上使用不同的隔离级别吗????如果是???将会发生什么。。。。如果没有???您将在哪个节点上收到错误消息????

这取决于执行的db语句的精确顺序以及全局或使用db事务设置的隔离级别。

 类似资料:
  • 我使用Spring调度程序,使用@调度注释来调度运行文件生成服务的作业。应用程序部署在集群环境中Tomcat的5个单独节点上,用于负载平衡和故障转移。正因为如此,服务被调度了5次,这是不可能的。有没有办法将调度程序配置为仅在当前节点上运行? 有一种方法使用数据库找出当前活动节点,并在这里调用该特定实例的调度器 另一种方法是使用石英调度器 由于我无法对部署的应用程序进行重大更改,是否有简单的解决方案

  • 问题内容: 将Singleton对象重构到集群环境的最佳策略是什么? 我们使用Singleton从数据库中缓存一些自定义信息。它 主要是 只读的,但是在发生某些特定事件时会刷新。 现在,我们的应用程序需要部署在集群环境中。根据定义,每个JVM将具有自己的Singleton实例。因此,当在单个节点上发生刷新事件并且刷新其缓存时,JVM之间的缓存可能不同步。 保持缓存同步的最佳方法是什么? 谢谢。 编

  • 目前Cloud-ML生态云只有武清集群。这个集群的基本配置如下: 武清集群 集群目前包括若干台CPU和GPU节点。 集群的Endpoint为:https://cnbj2.cloudml.api.xiaomi.com

  • 主要内容:缓存,Hibernate 一级缓存,快照区Hibernate 是一款全自动 ORM 框架,它会在应用程序访问数据时,自动生成 SQL 语句并执行,因此开发人员不需要自己编写 SQL 语句,但这也造成它无法像 MyBatis 一样,能够直接从 SQL 层面严格控制其执行性能以及对数据库的访问频率,所以很容易出现性能不佳的情况。 为此,Hibernate 提供了多种性能优化手段(例如 HQL、懒加载策略、抓取策略以及缓存机制),其中缓存机制是

  • 我的应用程序出现OutOfMemory异常。我已经把垃圾堆和垫子翻了个底朝天。在分析我的应用程序内存使用情况时,我发现以下疑点。我无法理解这些嫌疑人背后的主要原因。 请帮助我了解这种泄漏的怀疑和什么相关的解决方案。 “AJP-Bio-9002”-exec-5 at java.util.arrays.copyof([ci)[C(arrays.java:2882)at java.lang.abstra

  • 我们的(Spring)应用程序包含几个,这些调度器在夜间活动,以更改/更新中的一些数据(来自 )。 这一切都运行良好,问题是我们的应用程序很快就会在运行。 防止< code >实例A和< code >实例B的< code >调度程序同时执行相同工作的最佳选项是什么? **UPDATE** 群集环境设置为。 每个节点都与自己的数据库实例通信。每个数据库实例将数据复制到其他实例。 DB-实例不是设置为