2011-06-22 14 views
0

私は春に私のサービスメソッドの周りにトランザクションをラップするために設定したtxアドバイスがあります。だから私のバッチクラスでは、私はオブジェクトのリストをロードし、私のバッチクラスに返すサービスメソッドを呼び出します。私のバッチクラスでは、これらのオブジェクトのそれぞれを処理するサービスメソッドを呼び出します。しかし、オブジェクトのリストに異なる休止状態のセッションがロードされているため、そのサービスメソッドがオブジェクトの遅延ロードされたプロパティにアクセスしようとすると、遅延ロード例外が発生します。Spring/Hibernateを使用してバッチジョブの新しいセッション/トランザクションをいつ開始するか、そしてセッションをコミット/フラッシュするときのベストプラクティス?

バッチクラスは、これらのオブジェクトのすべてのID(long値)をロードするサービスを呼び出すだけです。このIDをロードするサービスメソッドに渡しますそのオブジェクトをIDのDBから取り出し、その処理を行います。

これについての考えは?

私が持っていたもう一つの質問は、これらのオブジェクトのそれぞれが互いに独立しているかどうかです。一度に1つのオブジェクトを1つずつ保持しないでください。 theres 5000が記録するなら、それはHibernateセッションのメモリ内のすべてのことをやっているので、save/update/insertを呼び出すときにアプリケーションがかなり遅くなるようです。しかし、代わりに、各レコード(一度に1つのIDを処理する)を保存/更新/挿入して、次のレコードに行く前にそのオブジェクトで完了したときにコミットすると、速度が大幅に向上するようです。また、私はそれを一括して、一言で言えば、一度に200件、あるいは5000件を一括して挿入/更新できずにエラーが発生した場合、何も保存されず、すべてがロールバックされます。

このようなことを処理するためのベストプラクティスは何ですか?本当に何かのように見えます。ありがとうございます

答えて

0

まず、Spring/Hibernateは実際にバッチ処理を意図していません。代わりに、TalendまたはPentaho(オープンソースに入っている場合)か、巨大な(多量!)さまざまな商用ツールのいずれかをチェックしてください。これらのツールのいずれかを使用して、必要なもの(挿入の最適化、エレガントなエラー処理などを含む)を正確に実行するJavaコードの塊を自動的に生成することができます。

さて、実際にSpring/Hibernateにバッチ処理をさせたいとします。いくつかの異なる問題があります。まず、Hibernateのセッションライフサイクルとは、ロードされたオブジェクトがライブセッションに関連付けられることを意味します。セッションflush()を使用すると、変更を強制的にデータベースに伝播できます。 Session close()はすべてを消去します。すでにロードされているオブジェクトは新しいセッションにのみ再接続することができます(通常はオブジェクトを再ロードする方が簡単です)。セッションを閉じる()/フラッシュ()しないと、最終的にメモリ不足になります。これを修正するには、Hibernateの第2レベルのキャッシュを追加します...しかし、それは単に物事をより複雑にし、遅くするだけです。

独立したHibernateセッション(オープン、作業、クローズ)内で各挿入を行うだけの本当の理由はありません。それは専用のツールほど高速ではありませんが、シンプルで、うまく動作し、多かれ少なかれあなたが得られるほど優れています。

0

バッチ処理については、バッチ処理を使用してください。link これは必要なバッチ処理に必要なすべての機能を提供します。オブジェクトの読み込みの問題について

ので 最適ではないかもしれないこれを回避する方法がある - バッチクラス はちょうど(長いそれらのオブジェクトのすべての IDをロードするためにサービスを呼び出し値)) - このIDをサービス に渡します。このメソッドは、オブジェクトID をDBからロードして、 の処理を行います。

と思われます。

関連する問題