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

时间:2014-03-27 07:45:08

标签: java hibernate java-ee

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

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

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

3)我们不能对每一笔交易采取悲观锁定。它会破坏hibernate缓存的有用性。

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

2 个答案:

答案 0 :(得分:3)

你的第一个语句不正确,hibernate中的第一级缓存不在同一个JVM的边界内维护。它保持在休眠会话的边界​​内。

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

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

  

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

hibernate中的事务管理直接映射到数据库事务," hibernate事务开始"只需调用" db transaction start" (通过JDBC或JTA)。关于隔离级别,这与jvm无关,并且不受它约束。

提出其他问题

  

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

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

答案 1 :(得分:1)

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