1

StatelessSession現在のSpring-Batch JDBC-TransactionおよびHibernate-Transactionに参加しているspring-batch Writer内で使用する方法はありますか?

私は試した

public class MyWriter implements ItemWriter<SomeClass> {
    @Override
    public void write(final List<? extends SomeClass> items) throws Exception {
        StatelessSession session = sessionFactory.openStatelessSession();
        Transaction tx = session.beginTransaction();
        for(SomeCLass item : items){
            session.insert(item);
        }
        tx.commit();
        session.close();
    }
}

しかし実際には、Spring-Batch によって処理されるセッションの外部で新しい HibernateSession を作成しています。StatelessSession現在の statefull- にアタッチされていることを取得する方法Session

myStatefullHibernateSession.save(item)背景:メソッドはセッションの一部ではない関連オブジェクトをロードしているため、ステートレス セッションを使用したいと考えています。作成されるSQLの数を最小限に抑えるためにそうしています。バッチ環境では、これによりCPUコストが大幅に節約され、数百万のデータレコードを処理しながらランタイムが短縮されます。

休止状態: 3.6.10
春バッチ: 2.2.0

編集:の助けを借りてaxtavt、同じ JDBC-Transaction を使用するように機能しましたが、さらに hibernate プロパティhibernate.jdbc.batch_sizeを使用しているため、次のような結果が得られます:

  1. spring-batch のトランザクション制御を使用して作成した場合beginTransactioncommitそれStatelessSession以上機能しません (ライターの後の例外はロールバックしません)。
  2. spring-batch の transaction-control でhibernate-transaction を作成しない場合は機能しStatelessSessionますが、spring-batch-commit はBatchingBatcherの Hibernate にある挿入/更新/削除ステートメントをコミットしませんStatelessSession

要約すると、ライターにStatelessSession標準の休止状態ステートフルの代わりに必要なだけです。Session

4

1 に答える 1