有没有办法StatelessSession
在参与当前spring-batch JDBC-Transaction和Hibernate-Transaction的spring-batch Writer中使用a?
我试过了
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
,这会导致以下观察结果:
- 如果在创建时使用
beginTransaction
and ,则spring-batch 的事务控制不再起作用(稍后编写器中的异常不会回滚)commit
StatelessSession
- 如果不在 spring-batch 的事务控制上创建 hibernate-transaction
StatelessSession
将起作用,但 spring-batch-commit 不会提交位于BatchingBatcher
Hibernate 中的插入/更新/删除语句StatelessSession
。
总结一下:我只需要一个StatelessSession
而不是我的作家中的标准休眠状态Session
。