如何基于数据库卷对步骤进行分区

时间:2015-06-18 06:12:21

标签: spring-batch

下面是

分区步骤的作业配置。

    <!-- master step, 10 threads (grid-size)  -->
    <step id="masterStep">
        <partition step="slave" partitioner="rangePartitioner">
            <handler grid-size="10" task-executor="taskExecutor" />
        </partition>
    </step>

</job>

<!-- Jobs to run -->
<step id="slave" xmlns="http://www.springframework.org/schema/batch">
    <tasklet>
        <chunk reader="pagingItemReader" writer="jdbcWriter"
            processor="itemProcessor" commit-interval="1" />
    </tasklet>
</step>

以下是我的分区java类

    Map<String, ExecutionContext> result = new HashMap<String, ExecutionContext>();

    int range = 5;
    int fromId = 1;
    int toId = range;

    for (int i = 1; i <= gridSize; i++) {
        ExecutionContext value = new ExecutionContext();

        System.out.println("\nStarting : Thread" + i);
        System.out.println("fromId : " + fromId);
        System.out.println("toId : " + toId);

        value.putInt("fromId", fromId);
        value.putInt("toId", toId);

        // give each thread a name
        value.putString("name", "Thread" + i);

        result.put("partition" + i, value);

        fromId = toId + 1;
        toId += range;

    }

    return result;

从上面的配置我可以使用分区,10个线程将运行,每个线程将处理5个记录。

有两种情况

1.如果只有5条记录,则其余9个线程不处理任何数据 2.如果一天数据量经常变化,则有5条记录,一天有100万条记录,在这种情况下,如果我在文件中对它们进行硬编码,我就无法每天配置网格大小和范围。 / p>

所以现在我的要求是动态地根据数据库的数量来处理线程,即基于特定表中的行数。

请为此建议我。

1 个答案:

答案 0 :(得分:0)

在Spring Batch中,有一个用于分区数据库记录的示例。该示例使用名为ColumnRangePartitioner的类。该类演示了如何查询min和max id,然后基于此进行分区。您可以直接从Github获取该类,并在您自己的代码中使用它或只应用主体。