我正在使用带有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。 如果我连续调用这些方法,我不会遇到这个错误。
答案 0 :(得分:0)
Hibernate会话对象不是线程安全的。您必须为每个线程使用自己的会话实例,或者必须将对会话实例的访问权限与java synchronized
块同步。
在Web环境中,每个浏览器会话应至少使用一个休眠会话。通过相同的浏览器会话访问可以是synchronized
,也可以使用多个会话(当您同时获取UI的不同区域时,我会将其与synchronized
同步,除非一个查询需要很长一段时间,其他查询不应该等待)。
注意:一个会话中的更新在其他会话中不会直接显示(对于实例已在另一个会话中缓存的情况)。