Spring batch 决定Spring批处理步骤、Tasklet还是块

Spring batch 决定Spring批处理步骤、Tasklet还是块,spring-batch,Spring Batch,我有一个直截了当的要求,我需要阅读一个项目列表(来自数据库),需要处理这些项目,一旦处理完毕,就必须将其更新到数据库中 我正在考虑将Spring批处理块与reader、processor和writer一起使用。我的阅读器将从列表中一次返回一个项目,并将其发送到处理器,一旦处理结束,它将返回到Writer,在那里更新数据库 我以后可能会用这些方法中的一些同步成本来多线程处理它 在这里,我预见到一些担忧 要处理的项目数可能会更多。可能在10万甚至更多 处理器中需要一些逻辑计算。因此,一次处理1个项目

我有一个直截了当的要求,我需要阅读一个项目列表(来自数据库),需要处理这些项目,一旦处理完毕,就必须将其更新到数据库中

我正在考虑将Spring批处理块与reader、processor和writer一起使用。我的阅读器将从列表中一次返回一个项目,并将其发送到处理器,一旦处理结束,它将返回到Writer,在那里更新数据库

我以后可能会用这些方法中的一些同步成本来多线程处理它

在这里,我预见到一些担忧

  • 要处理的项目数可能会更多。可能在10万甚至更多
  • 处理器中需要一些逻辑计算。因此,一次处理1个项目。不确定性能,即使它是由10个线程组成的多线程
  • 编写器可以在数据库中更新该已处理项的结果。不确定如何进行批量更新,因为它始终只有1个已处理和准备就绪的项目
  • 这种方法对这种用例正确吗?或者可以做更好的事情吗? 有没有其他方法可以一次调用读写器、处理器和写入器来处理一堆项目?如果是这样,我是否需要创建一些机制,从列表中提取10个条目,并将其交给处理器? 似乎writer会在每个记录出现时进行更新,只有当writer收到一堆已处理的项目时,批量更新才有意义。有什么建议吗

    为了更好的性能,请在这个设计上加一些灯


    谢谢,

    Spring Batch是满足您需求的完美工具

    面向区块的步骤允许您使用提交间隔属性配置要读取/处理/写入的项目数

            <batch:step id="step1" next="step2">
            <batch:tasklet transaction-manager="transactionManager" start-limit="100">
                <batch:chunk reader="myReader" processor="myProcessor" writer="MyWriter" commit-interval="800" />
                <batch:listeners>
                    <batch:listener ref="myListener" />
                </batch:listeners>
            </batch:tasklet>
        </batch:step>
    
    
    
    假设读者将调用返回10000条记录的SELECT语句。您将提交间隔设置为500

    MyReader将调用read()方法500次。假设在现实中,阅读器实现实际上可能会从结果集中删除项。对于每个read()调用,它还将调用MyProcessor的process()方法

    但在达到提交间隔之前,它不会调用MyWriter的write()方法

    如果查看接口ItemWriter的定义:

    public interface ItemWriter<T> {
    
    /**
     * Process the supplied data element. Will not be called with any null items
     * in normal operation.
     * 
     * @throws Exception if there are errors. The framework will catch the
     * exception and convert or rethrow it as appropriate.
     */
    void write(List<? extends T> items) throws Exception;
    
    }
    
    公共接口ItemWriter{
    /**
    *处理提供的数据元素。将不会使用任何空项调用
    *在正常运行中。
    * 
    *@在出现错误时引发异常。框架将捕获
    *异常,并根据需要对其进行转换或重新排序。
    */
    
    非常感谢你的建议。真的很有帮助。请你指导一下好吗?