【问题标题】:Howto use Hibernate StatelessSession in SpringBatch Writer如何在 Spring Batch Writer 中使用 Hibernate 无状态会话
【发布时间】: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,这会导致以下观察结果:

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

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

【问题讨论】:

    标签: java hibernate batch-processing spring-batch


    【解决方案1】:

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

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

    您可能需要让HibernateTransactionManager 知道您用来创建SessionFactoryDataSource,请参阅HibernateTransactionManager.setDataSource()

    【讨论】:

    • 一个好主意,但遗憾的是在我的情况下无法正常工作。这将创建一个绑定到当前连接和 sql-transaction 的 StatelessSession。就我而言,我使用的是设置为 >50 的休眠属性 hibernate.jdbc.batch_size 。这导致了一个问题,即当前位于 statelesssession-jdbc-batch 中的所有插入/更新/删除语句在完成 writer-method 时都没有被提交,因为正在提交 sql-transaction 而不是 stateless-session等待提交 jdbc-batch-package。 (我会调整我的问题)
    猜你喜欢
    • 2019-01-04
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 2018-08-18
    • 2013-08-02
    • 1970-01-01
    • 1970-01-01
    • 2020-08-28
    相关资源
    最近更新 更多