找到对集合的共享引用:在同一用户会话中并行使用事务时

时间:2012-05-25 12:06:57

标签: spring hibernate jpa

我正在使用带有spring 3.0.5的hibernate 3.3并使用JPA事务管理器。 我的场景是一个ui页面,在服务层上调用两个get方法来在UI中呈现两个区域,请求是并行的ajax请求。服务层中的get方法返回同一实体的两个“单独”列表。

List<Car> getCarsA();
List<Car> getCarsB();

我已将JPA事务管理器配置如下:

<tx:method name="get*" read-only="true" propagation="REQUIRED"/>

问题:当hibernate / JPA在每个服务方法结束后调用flush时,可能会有一些集合(通过多对多映射),这些集合在方法返回的两个列表之间共享,因此也是异常。我也在使用OpenEntityManagerInViewFilter。 如果我连续调用这些方法,我不会遇到这个错误。

1 个答案:

答案 0 :(得分:0)

Hibernate会话对象不是线程安全的。您必须为每个线程使用自己的会话实例,或者必须将对会话实例的访问权限与java synchronized块同步。

在Web环境中,每个浏览器会话应至少使用一个休眠会话。通过相同的浏览器会话访问可以是synchronized,也可以使用多个会话(当您同时获取UI的不同区域时,我会将其与synchronized同步,除非一个查询需要很长一段时间,其他查询不应该等待)。

注意:一个会话中的更新在其他会话中不会直接显示(对于实例已在另一个会话中缓存的情况)。