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
を使用しているため、次のような結果が得られます:
- spring-batch のトランザクション制御を使用して作成した場合
beginTransaction
、commit
それStatelessSession
以上機能しません (ライターの後の例外はロールバックしません)。 - spring-batch の transaction-control でhibernate-transaction を作成しない場合は機能し
StatelessSession
ますが、spring-batch-commit はBatchingBatcher
の Hibernate にある挿入/更新/削除ステートメントをコミットしませんStatelessSession
。
要約すると、ライターにStatelessSession
標準の休止状態ステートフルの代わりに必要なだけです。Session