0

Spring 3.0.5で休止状態3.3を使用し、JPAトランザクションマネージャーを使用しています。私のシナリオは、UI で 2 つの領域をレンダリングするためにサービス層で 2 つの get メソッドを呼び出す UI ページです。リクエストは並列 ajax リクエストです。サービス層の get メソッドは、同じエンティティの 2 つの「別々の」リストを返します。

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

以下のように JPA トランザクション マネージャーを構成しました。

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

問題 : 各サービス メソッドが終了した後に hibernate/JPA がフラッシュを呼び出すと、(多対多マッピングを介して) メソッドによって返される 2 つのリスト間で共有されるコレクションが存在する可能性があるため、例外が発生します。OpenEntityManagerInViewFilter も使用しています。メソッドを連続して呼び出すと、このエラーは発生しません。

4

1 に答える 1

0

Hibernate セッション オブジェクトはスレッドセーフではありません。スレッドごとに独自のセッション インスタンスを使用するか、セッション インスタンスへのアクセスを Javasynchronizedブロックと同期する必要があります。

Web 環境では、ブラウザ セッションごとに少なくとも 1 つの休止状態セッションを使用する必要があります。同じブラウザー セッションによるアクセスは、複数のセッションである場合もあれば、複数のセッションを使用する場合もあります (UI のさまざまな領域を同時にフェッチする場合は、1 つのクエリで他のクエリが待機してはならない非常に長い時間が必要な場合synchronizedを除いて、同期します)synchronized為に)。

注意: 1 つのセッションでの更新は、他のセッションでは直接表示されません (インスタンスが他のセッションで既にキャッシュされている場合)。

于 2012-05-25T12:41:42.303 に答える