0

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

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

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

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

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

4

1 回答 1

0

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

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

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

于 2012-05-25T12:41:42.303 回答