2011-01-21 4 views
2

私はVehicle DTOを持ったVehicleエンティティを持っています。Hibernate Cache1 OpenSessionInViewを使ったOutOfMemory

私はOpenSessionInViewにストライプスを使用します。

私のStripesアクションビーンズでは、約50000ビークルのデータを含むcsvを生成する必要があります。ストライプの開発者が行うことを私に言ったよう

このように、私は次のような方法でのOutputStreamへのファイル書き込み:私はいくつかのページネーション情報を取るサービスを持っている

StreamingResolution() {...}.stream(HttpServletResponse) 

を、車の一部をロードそれらをDTOに変換します。

これらのdtoはビューに戻され、csvに書き込まれます。

ページネーションシステム(各ページ500アイテム)は、50000 DTOのリストを持たないようにして、メモリに問題がありました。

しかし、まだ完全には機能しません。 Jmapでは、csvプロセスの終わりに、ヒープスペースにロードされた40000台以上の車両があり、ガベージコレクションは行われませんでした。 Yourkitプロファイラで

、(StatefulPersistenceContextで参照)、これらのエンティティは、休止状態のL1キャッシュに残っているように私には思える、と私はOpenSessionInViewを持っているので、私はこの問題は、会話が少し長いとキャッシュであるということだと思いますきれいにする必要があります...

私のDAOメソッドの読み込み車は、セッションが必要ないサービスの多くで使用されているので、エレガントな方法でこれを行う方法はちょっと思います。

誰かが私ができることを知っていますか?私はDAO /サービスでセッションをクリアする方法を作ることができると思いますが、それはあまりエレガントではありません...

これはかなり大きなプロジェクトであり、私は非常に簡単な説明をしました。私の決定ではありません。);

+1

私の見解層の上にサービスコールの後にセッションを閉じるような何かをし、再度開く方法はあります新しいサービスコールのための新しいセッション?私は、OpenSessionInViewフィルタがない場合と同様に、サービスコールだけでは、行う方法がないことを意味します。 –

+0

はい、あります - あなたが休止状態とやり取りする方法を示すコードを投稿してください。 – Pablojim

+0

私は春の休止状態テンプレートをdaosで使用しています –

答えて

4

これはエレガントではないかもしれませんが、このような場合にはセッションからのエンティティの撤去が唯一の実用的な解決策です。

たとえば、エンティティのデータを出力ストリームに書き込んだら、session.evict(entity)と呼んでセッションキャッシュから削除します。あるいは、各 "ページ"の最後にこれを呼び出します。

ページングメカニズムとエビクションの組み合わせによって、一度にキャッシュ内に500を超えるエンティティが存在しないようにする必要があります。

+0

問題は、春の休止状態のテンプレートにアクセスできないため、ほぼ同じです。つまり、エンティティを追い出すためにDAOメソッドを作成する必要がありますか? –

3

おそらく、ステートレスセッションを明示的に開く必要があります。

ドキュメントから

StatelessSession session = sessionFactory.openStatelessSession(); 

A StatelessSessionは関連する永続 コンテキストを持っていないと は、より高いレベル ライフサイクルセマンティクスの多くを提供していません。特に、 ステートレスセッションは、 第1レベルキャッシュを実装しておらず、 第2レベルまたはクエリキャッシュと対話しません。それ は実装されていません ライトビハインドトランザクション以上の詳細はこちらをご覧ください

をチェック汚い 自動:

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/batch.html

+0

niceを知っていますが、私はSpringを使用しており、StatelessHibernateCallbackは3.0のみで導入されました(私は2.5を持っています) –

+0

あなたは依然として基本となるSessionFactoryのハンドルを取得できるはずです。正確な状況(と休止状態のバージョン)のいくつかの詳細を投稿し、私が助けることができるかどうかがわかります。 – Pablojim

4

立ち退かががエレガントあるオブジェクトと、それは良いだけですレポート作成時のソリューション、CSVへのエクスポートなど

ベストエレガントな方法は、iteratorをオープンするサービス内で実装することです。プロセスの後に各項目を追い出します。クラスはサービスコールのために提供されます。これはアイテム消費者になります。

公開インタフェースItemConsumer { void consume(Item item); }

ます。public void processAllItems(ItemConsumer消費者){

...あなたの仕事 を行う}

関連する問題