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