1

有没有办法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,这会导致以下观察结果:

  1. 如果在创建时使用beginTransactionand ,则spring-batch 的事务控制不再起作用(稍后编写器中的异常不会回滚)commitStatelessSession
  2. 如果不在 spring-batch 的事务控制上创建 hibernate-transactionStatelessSession将起作用,但 spring-batch-commit 不会提交位于BatchingBatcherHibernate 中的插入/更新/删除语句StatelessSession

总结一下:我只需要一个StatelessSession而不是我的作家中的标准休眠状态Session

4

1 回答 1

0

如果 Spring Batch 使用常规的 Spring 事务管理(HibernateTransactionManager等),那么您可以尝试获取Connection绑定到当前事务使用DataSourceUtils并在打开时使用它StatelessSession

Connection c = DataSourceUtils.getConnection(dataSource);
StatelessSession session = sessionFactory.openStatelessSession(c);

您可能需要HibernateTransactionManager了解DataSource用于创建的SessionFactory,请参阅HibernateTransactionManager.setDataSource()

于 2013-07-03T19:24:13.870 回答