web-dev-qa-db-ja.com

org.hibernate.LazyInitializationException:プロキシを初期化できませんでした-セッションがありません

私のWebアプリケーションがヒットする2つの物理サーバーがロードバランサーによって管理されています。私はいつも得る-

org.hibernate.LazyInitializationException:プロキシを初期化できませんでした-セッションがありません

一方のサーバーがヒットし、もう一方のサーバーが問題なくスムーズに実行されたとき。ローカルマネージドキャッシュストアを有効にして、アプリケーションで管理しています。この例外は、1つのテーブルから1つの特定の列にアクセスしようとしたときにのみ発生します。残りの操作は、どのサーバーがヒットしたかに関係なく、完全に正常に機能します。

そのテーブルの行数が非常に多いため、lazy = falseを作成するとパフォーマンスの問題になります。ちなみに、セッションではload(object)の代わりにget(object)を使用しています。

10
Surya Mukerjee

あなたが提供したタグから、SpringFrameworkを使用してこの問題に遭遇したと推測します。 Spring Data org.springframework.data.jpa.repository.JpaRepositoryを使用しているときに、同じLazyInitializationExceptionに遭遇しました。

Hibernateを間接的に使用してデータベースからデータを取得するメソッドに@Transactionalで注釈を付けることで、問題を解決しました。

13
Abdull

アクセスしようとしている列がエンティティ内のある種の関連付け(OneToMany、ManyToOneなど)として構成されており、DAOにその関連付けを設定していないようです。次に、その列(Hibernateセッションがないコード内の場所)にアクセスしようとすると、その列は読み込まれず、Hibernateはそれをロードしようとし、ブームを起こします。

実際にはその関連付けのデータを使用しているので、それをEAGERにすることは、実際にやりたいことのように聞こえます。また、そのテーブルが非常に大きい場合は、テーブルに対するクエリが効率的になるように、インデックスを作成することを検討する必要があります。

10
atrain

オブジェクトが切り離されています。アクセスする前に、現在のセッションに再接続する必要があります。

session.update(object);

また、トランザクション内でアクセスするようにしてください

問題/解決策についてもっと読む ここ

5
tolitius

それは関連付けまたはプロパティですか?それがプロパティである場合、問題はサーバーの1つがインストルメントされていないバージョンを実行していることである可能性があります。

Lazy attribute fetching: an attribute or single valued association is fetched when the instance variable is accessed. This approach requires buildtime bytecode instrumentation and is rarely necessary.
0
gkamal