0

EAR を Glassfish 3.1 クラスターにデプロイするときに問題が発生します。セットアップは次のようになります。 ホスト PC 上のクラスター 1 と 2 VM Apache 上の 2 つのインスタンス 2 つのインスタンス間で負荷分散する mod_jk を使用 (スティッキー セッションを使用) Tapestry 4.x Web アプリ

問題は次のとおりです。

  1. my.domain.com にアクセスしました
  2. インスタンス 1 にリダイレクトされます (インスタンス 1 になると Apache が判断します)
  3. ログイン
  4. インスタンス 1 をシャットダウンする
  5. ページを更新
  6. Apache は私をインスタンス 2 にリダイレクトします

セッション (loginData) に JPA エンティティを格納しています。エンティティには、いくつかの遅延読み込みプロパティがあります。したがって、インスタンス 2 にリダイレクトされると、次のようなエラーが表示されます。

Exception Description: An attempt was made to traverse a relationship using indirection         that had a null Session. 
This often occurs when an entity with an uninstantiated LAZY relationship is serialized and that lazy relationship is traversed after serialization. 
To avoid this issue, instantiate the LAZY relationship prior to serialization.

だから私が推測しているのは、このオブジェクトがシリアル化された時点で、オブジェクトはまだすべてのプロパティで膨らんでいないということです。

fetch=EAGER に変更すると、すべて期待どおりに機能します。

EAGERに変更することは、実際にはオプションではありません...

この問題を解決する方法はありますか?

ありがとう

4

1 に答える 1

0

HttpSession に JPA エンティティを格納することはお勧めできません。エンティティの有効期間を 1 つの HttpRequest に制限することで、多くの問題を回避できます。エンティティ ID をセッションに保存し、それを使用して各リクエストでエンティティをフェッチします。JPA/Hibernate キャッシング オプションを潜在的に使用して、毎回データベース ヒットを防ぎます。

あなたの状況では、これは、ログイン後にエンティティの @Id 値を HttpSession に保存することを意味します。次に、インスタンス 2 が HttpSession からエンティティを取得しようとすると、ID を取得し、それを使用して更新要求の範囲内で実際のエンティティを取得します。

于 2013-08-12T11:01:35.187 に答える