2011-01-12 9 views
3

私はトランザクションで「うまく」動作するRooプロジェクトを持っていますが、各.merge()または.persist()は10ミリ秒かかるはずですトランザクションの最後に向かって5000ms。幸運なことに、私の変更は個別に冪等であるため、実際にはトランザクションは必要ありません。トランザクションのないバッチジョブとしてのSpring Rooプロジェクト

しかし、私は、私は古典的に実行するトランザクション処理を捨てる私はmyObject.mergeを(やるとき「は、文脈が閉じられた」)

私が実行しているジョブはバッチとして、コマンドラインからのもので、なし私は私が(持続)と合併することを可能にするために何ができる

public static void main(final String[] args) { 
    ImportUnitFromDisk importer = new ImportUnitFromDisk(); 
    int status = importer.run(args[0]); 
    System.out.println("Import data complete status: " + status); 
    System.out.println("All done!"); 
    System.exit(0); 
} 

():

public static void main(final String[] args) { 
    context = new ClassPathXmlApplicationContext("META-INF/spring/applicationContext.xml"); 
    JpaTransactionManager txMgr = (JpaTransactionManager) context.getBean("transactionManager"); 
    TransactionTemplate txTemplate = new TransactionTemplate(txMgr); 
    txTemplate.execute(new TransactionCallback() { @SuppressWarnings("finally") 
    public Object doInTransaction(TransactionStatus txStatus) { 
    try { 
     ImportUnitFromDisk importer = new ImportUnitFromDisk(); 
     int status = importer.run(args[0]); 
     System.out.println("Import data complete status: " + status); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } finally { 
     return null; 
    } 
    }}); 

    System.out.println("All done!"); 
    System.exit(0); 
} 

しかし、私が本当にやりたいことは、このようなものです:ので、ここで私は通常、何をすべきかですtrを使ってエンティティがSpring Roo(OpenJPAとMySQLを使用)で生成されていることを前提にしていますか?

乾杯

ニック

+0

トランザクション内で行うことは何ですか:readonly? – Ralph

答えて

1

変更が冪等であっても、あなたはまだ取引が必要になります。

パフォーマンスに関しては、

  1. エンティティオブジェクトはどの程度密接に結合されていますか。 (例えば、すべてのテーブルの参照がエンティティの関係に移行されている場合は、かなり緊密に結合されています)

  2. 不要な双方向関係を削除する必要があります。

  3. マスタテーブルを特定し、マスタレコードにマッピングするエンティティを削除します。

  4. カスケードオプションは何ですか?あらゆる場所にすべてのオプションがカスケード接続されているかどうかを確認してください。

は、私にとっては、エンティティマップがあまりにも緊密に結合されて見えます。オブジェクト全体のグラフをマージキックオフとカスケードオプション(誰もが...持っている人を知っています)。

+0

これらはかなり密接に結合されています.1つのボリュームには多くのページがある多くのドキュメントがあります。最初は1つのボリュームに多数のページがあり、ドキュメントを見つける必要があり、ボリューム参照はドキュメントとページの両方を必要とします。同じように。私はカスケードのオプションを見てみましょう – niklassaers

+0

私はあなたの質問から、オブジェクトがすべて密接に一緒に編み込まれている静かな明白だと思います。ドメイン自体が密接に結合されたオブジェクトを持っていることもありますが、クエリを使用して関係を置き換えることはできませんか、マッピングへの怠惰な読み込みを推奨し、間違いなくカスケードオプションを調べてください。カスケードはORMで子エンティティをマージする方法です。 –

+0

私は以下を追加する必要があります:すべてが遅延ロードされています – niklassaers

1

私はSpring/Hibernateのバッチプロセスでまったく同じパフォーマンスの問題を経験しました。これはSpring RooやSpringとは何の関係もないことに注意してください。これはHibernate/JPAの働きによるものです。

基本的な問題は、トランザクションの一部であるすべてのJavaエンティティのセッションキャッシュを維持し、(バイトコード計測が行われていない)新しいエンティティに対しては、Hibernateが各フラッシュ上のエンティティをスキャンして更新があった場合。これは、n =セッション内の新しいエンティティのうち少なくともO(n)です。バッチプロセスが主に新しいエンティティを追加している場合、バッチ全体のO(n^2)動作に変わります。

1つのトランザクションでプロセス全体を維持する場合は、定期的に(挿入/更新を行うために)フラッシュしてから、セッションで保持する必要がなくなったエンティティを退去させます。別の解決策は、バッチプロセスを複数のトランザクションに分割することです。

詳細については、http://www.basilv.com/psd/blog/2010/avoiding-caching-to-improve-hibernate-performanceを参照してください。

+0

本当に、私はたぶん、銀色の弾丸としてあまりにも多くのHibernateを使用していた。私はそれを複数の小さなトランザクションに分割してしまいました。しかし、もし私がそれをやり直すなら、私はORMの使用について二度考えたと思います。 – niklassaers

関連する問題