繁体   English   中英

集群环境中的休眠一级缓存

[英]hibernate first level cache in clustered environment

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

1)可以在两个不同节点的一级缓存中修改实体,从而导致陈旧的数据问题,数据丢失的问题。

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

3)我们不能对每笔交易都持悲观的态度。 它将杀死休眠缓存的有用性。

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

您的第一条语句不正确,休眠状态下的第一级缓存未在同一JVM的边界内维护。 它保持在休眠会话的边界​​内。

Hibernate分别处理会话(会话中的实体,这是第一级缓存),即使在同一jvm中,您也可以在一个jvm中拥有多个hibernate会话。

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

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

休眠中的事务管理直接映射到数据库事务,只需通过调用“ db事务开始”(通过JDBC或JTA)来标记“休眠事务开始”。 关于隔离级别,这与jvm无关,并且不受其限制。

对你的另一个问题

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

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

拳头级别的缓存不会产生过时的数据,我一直在集群环境中使用JPA + Hibernate,而与此相关的任何问题都没有。 重要的是事务的隔离级别。 如果您不希望其他节点读取未提交的数据,请确保至少使用READ_COMMITED级别。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM