当前位置: 首页 > 知识库问答 >
问题:

处理Spring批处理中的多行

江曦
2023-03-14

我是Spring批处理的新手,我只想问如何从多行结果集中检索数据。我有以下场景:

>

  • 有两个不同的表说员工

    <EMP>
    ....
    ...
    <Payroll>
    .
    .
    .
    </Payroll>
    <Payroll>
    .
    .
    .
    </Payroll>
    </emp>
    

    使用RowMapper时,我只能创建一个工资单子级,但该表可能有多个子级。请帮助...

  • 共有2个答案

    贺华容
    2023-03-14

    您需要一个类似于组读取器的东西,它被包装在您的数据库读取器周围。

    我在另一个答案中解释了这种方法:Spring批处理聚合值并编写单个值

    郭弘盛
    2023-03-14

    此用例正是创建Hibernate等ORM框架的原因。考虑为您的阅读器使用HibernateCursorItemReader,然后定义您的持久性层,以便您拥有以下内容:

    @Entity
    @Table(name = "emp")
    public class Employee {
    
        @Id
        @Column(name = "emp_id")
        private Long id;
    
        @OneToMany(mappedBy="employee")
        private Set<Payment> payments = new HashSet<>();
    
    }
    
    @Entity
    @Table(name = "pay")
    public class Payment {
    
        @Id
        @Column(name = "pay_id")
        private Long id;
    
        @ManyToOne
        @JoinColumn(name = "emp_id")
        private Employee employee;
    
    }
    
     类似资料:
    • 我正在尝试使用多个处理器类在处理器步骤中处理记录。这些类可以并行工作。目前我已经编写了一个多线程步骤,其中我 设置处理器类的输入和输出行 提交给遗嘱执行人服务 获取所有未来对象并收集最终输出

    • 我有以下工作要处理在一定的时间间隔或特别的基础上。 作业中的步骤如下: 我也想要用户界面,在那里我可以触发一个特别的基础上的工作,而且我应该能够提供参数从用户界面。 我想用Spring batch来完成这个任务,但它更多的是用于读->处理->写之类的工作。这里,在第一步中,我正在生成由第二步读取的数据。我不确定我是否还可以使用Spring batch来实现这个,或者有更好的方法来实现这个。

    • 当我使用Spring批处理管理运行长时间运行的批处理作业的多个实例时,它会在达到jobLauncher线程池任务执行程序池大小后阻止其他作业运行。但是从cron中提取多个工作似乎效果不错。下面是作业启动器配置。 Spring批处理管理员Restful API是否使用不同于xml配置中指定的作业启动器?

    • 我在表中总共有8条记录,其中6条在spring批处理调用read时可以使用jpareader。现在我将页面大小和块大小设置为1以进行测试。期望作业运行时,它应该进行6次读取调用,然后它应该逐个处理,逐个写入。但实际上发生的是,它只是调用read 4次(从日志中我可以看到这样读取页面0...1)并处理4个,其中一个由于不匹配写入标准而被过滤掉,然后它只是更新了3个记录,作业标记为成功完成。

    • 我对Spring批处理跳过逻辑有一些问题。我已经配置了一个作业的步骤来跳过两个异常(SQLIntegrityConstraintViolation异常和乐观锁定失败异常): 但当作业运行时,由于我将其配置为跳过的异常,作业以未知状态完成: 我做错什么了吗?我希望这一步跳过负责抛出其中一个异常的项,并继续处理,以便以完成状态结束。

    • 我们使用Spring Batch进行一些处理,通过Reader读取一些ID,我们希望通过处理器将它们处理为“块”,然后写入多个文件。但是处理器接口一次只允许处理一个项目,我们需要进行批量处理,因为处理器依赖于第三方,不能为每个项目调用服务。 我看到我们可以为“块”中涉及的所有读取器-处理器-写入器创建包装器,以处理列表<>并委托给一些具体的读取器/处理器/写入器。但这对我来说并不是件好事。像这样: