2014-03-27 47 views
4

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

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

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

3)我们不能对每一笔交易采取悲观的锁定。它会杀死休眠缓存的有用性。

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

回答

1

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

+0

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

+1

我不同意。在休眠之下,你真正拥有的是数据库事务,并且这两个应用程序实例都攻击同一个数据库。如果app [node1]打开事务并刷新(不提交),app [node2]将读取未被取消的数据,除非使用READ_COMMITED隔离级别。 – codependent

+0

Hibernate不使用DB锁进行事务管理。检查hibernate事务API。很少数据库不支持所有类型的隔离级别。如果在Hibernate中设置READ_COMMITED隔离级别,那么它不是数据库的隔离级别。 Hibernate通过悲观锁定来获取数据库隔离。 – user3082820

3

您的第一条语句不正确,hibernate中的第一级缓存未在同一JVM的边界内维护。它保持在休眠会话的边界​​内。 Hibernate将会话(会话中的实体,这是第一级缓存)分开处理,即使在同一个jvm中,也可以在一个jvm中有多个休眠会话。

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

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

hibernate中的事务管理直接映射到DB事务,通过调用“db transaction start”(通过JDBC或JTA)简单地标记“hibernate事务启动”。关于隔离级别,这与jvm没有任何关系,并且不受其约束。

你的其他问题

广东话您使用不同的节点上不同的隔离级别????如是???会发生什么....如果不是?在哪个节点上你会得到一个错误信息?

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