Spring Batch Partition-创建分区需要花费大量时间并影响Batch工作

时间:2018-10-13 06:26:29

标签: java spring-batch partitioning

我正在开发 Spring Batch 代码。我的应用程序从Account表中读取帐户的详细信息。通常,我以前得到的Accounts在80万到160万之间。我需要将所有这些帐户发送到SQL查询中的DW(数据仓库),以从DW获取每个帐户的AUTH,DEBIT和CLEARING详细信息,并将这些详细信息保存到我的数据库表中。

在Spring Batch中,我想到使用分区,我使用了类似以下的代码:

<batch:step id="masterStep" next="getUniqueAccounts">
    <partition step="fetchProcessedDataForAccounts"  partitioner="accountPartitioner">
        <handler grid-size="40" task-executor="taskExecutor" />
    </partition>
</batch:step>

我也用过

<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
    <property name="corePoolSize" value="40" />
    <property name="maxPoolSize" value="40" />
    <property name="allowCoreThreadTimeOut" value="true" />
</bean>

观察-我从查询中获得120万个帐户,因此将创建12,00,000 / 40 = 30 000个分区,并在单个分区中创建40个线程。我将所有这些帐户以LIST格式发送给IN子句。

我已经看到,仅创建3万个分区,Spring Batch代码将花费大约4个小时,然后查询将被执行到DW。

为什么会这样?

1 个答案:

答案 0 :(得分:0)

  

我从查询中获得120万个帐户,因此将创建12,00,000 / 40 = 30 000个分区

您将没有30.000分区(顺便说一句,它不是30.000,而是300.000 = 1.200.000 / 40),但是只有40个分区。每个分区将有300.000个项目。

  

在一个分区中将创建40个线程

这不是本地分区的工作方式。您定义了一个40个线程的线程池。每个分区将由一个线程而不是40个线程处理。

  

我将所有这些帐户以LIST格式发送给IN子句。

此IMO在您的性能问题中承担很大责任。我建议改用driving query pattern。只读帐户ID,然后使用处理器查找帐户详细信息,然后将其写入目标表。此模式与面向块的处理模型很好地配合。

希望这会有所帮助。