我正在开发 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。
为什么会这样?
答案 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,然后使用处理器查找帐户详细信息,然后将其写入目标表。此模式与面向块的处理模型很好地配合。
希望这会有所帮助。