0

私は、メモリ内データを改造しようとしているかなり巨大なプロジェクトを持っています。基本的に、プリミティブを含むオブジェクトの大きなコレクションと、休止状態に存在するその他のオブジェクトがあります。非 dao コードの大部分は、ハイバネートによる遅延読み込みに依存して、オンザフライでオブジェクトをハイドレートします。ただし、すべてがメモリに存在するため、オブジェクトが読み込まれず、休止状態の遅延読み込み例外が発生します。

ハイバネートにディップしてハイバネート オブジェクトを手動でハイドレートすることで、ハイバネート レイジー ロードを手動で実装することもできますが、そのオブジェクトのオブジェクト グラフは巨大で、初期化と設定が必要な数百のタイプが含まれています。これは実用的ではないようで、この問題に対する実行可能な解決策を探しています。この種の問題または同様の問題に関連するヒント、ヒント、解決策、またはストーリーを誰かが持っている場合、私は非常に感謝しています.

どうもありがとう。

4

3 に答える 3

1

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

これには、開いているセッションが必要な時間も制限されるという副作用があります。セッションを開き (セッション ファクトリをお勧めします)、必要に応じて閉じることができます。ただし、セッションを開いたり閉じたりするためにデータベースに重大なヒットが発生する可能性があると思います (根本的なトランザクションが本当の問題だと思います)。私が理解している限り、読み取り用のトランザクションを必要としない JPA を調べることをお勧めします。Spring には、トランザクションとセッションの管理を自動化するための優れた機能もいくつかあります。

于 2009-05-18T19:35:35.007 に答える
0

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

SpringHibernateTemplateを使用してオブジェクトをロードしている場合、ロードしたオブジェクトは必ずデタッチされることに注意してください。Spring MVC を使用して Web アプリケーションを構築している場合、これを回避する簡単な方法は、 OpenSessionInViewInterceptorを使用することです。

于 2009-05-18T19:46:14.970 に答える
0

おそらく、セッションはすでに閉じられています。データが遅延ロードされるときはセッションを開いたままにしてください。それが不可能な場合は、コレクションに lazy="false" 属性を指定して熱心なロードを実行してください (デフォルトは lazy="true" です)。

于 2009-05-18T19:30:18.747 に答える