2009-05-18 3 views
0

私はメモリ内のデータを改造しようとしているかなり巨大なプロジェクトがあります。本質的に、私は、ハイバネートに存在するプリミティブと他のオブジェクトを含むオブジェクトの大きなコレクションを持っています。非DAコードの大部分は、飛行中にオブジェクトを水和させるために冬眠中の遅延読み込みに依存しています。しかし、すべてがメモリに存在するため、オブジェクトがロードされず、休止状態のレイジーロード例外が発生します。どのようにしてオブジェクトを休止状態からメモリ内に引き出すことができますか?私はセッションの問題にぶつかっています

hibernateオブジェクトを手動で休止状態にして水分補給することで、手動でhibernate遅延ロードを実装することはできますが、そのオブジェクトのオブジェクトグラフは膨大で、初期化および設定が必要な数百種類もあります。これは実用的ではないようですが、私はこの問題に対する実行可能なソリューションを探しています。誰かがこの種の問題や同様の問題に関連するヒント、ヒント、解決策、またはストーリーを持っているなら、私は非常に感謝しています。

ありがとうございました。

答えて

1

セッションを手動で処理する場合は、フルオブジェクトではなくオブジェクトID(データベースの行ID)を渡してみてください。次に、完全な吹き飛ばされたORMオブジェクトを取得し、ORMオブジェクトを限られたスコープに保持したいときに、データベース読込みを実行します。そうすることで、ORMオブジェクトをガベージコレクションできるようになります。これはおそらくあなたにいくつかのメモリを節約します。

これには、オープンセッションが必要な時間も制限されるという副作用があります。セッションを開くことができます(私はセッションファクトリをお勧めします)。しかし、オープンセッションとクローズセッションで重要なデータベースヒットがあると思います(基本的なトランザクションが本当の問題だと思います)。あなたが理解するところでは、読み込みのためのトランザクションを必要としないJPAを調べたいかもしれません。 Springには、トランザクションやセッション管理を自動化するための素晴らしい機能があります。

0

セッションが既に閉じている可能性があります。データが遅延ロードされているときにセッションを開いたままにするか、そうでない場合は、lazy = "false"属性(lazy = "true"がデフォルト)を指定して熱心な負荷をかけます。

0

LazyInitializationExceptionの最も一般的な原因は、休止状態のセッションが閉じていることです。休止状態のセッションを開いたままにしておけば、大丈夫です。

スプリングHibernateTemplateを使用してオブジェクトをロードする場合は、ロードするオブジェクトは必ず切り離されます。 Spring MVCを使用してWebアプリケーションを構築する場合、簡単な方法はOpenSessionInViewInterceptorを使用することです。

関連する問題