在单线程Spring批处理作业中读取和更新同一个Oracle表有什么问题吗?

问题描述 投票:0回答:1

我编写了一个单线程

Spring Batch Job
来修复表列中的数据。 也就是说,这是一项简单的工作,没有并行或多线程步骤。它只是使用
JdbcCursorItemReader
来“流”数据,并通过编写器用正确的数据修复和更新行。主要工作步骤如下所示:

@Bean("orderidFixerStep")
@JobScope
public Step orderidFixerStep(final JdbcCursorItemReader<Order> orderIdReader,
                           final OrderIdItemWriter orderIdItemWriter,
                           final JobRepository jobRepository,
                           final PlatformTransactionManager transactionManager,
                           final AppProperties appProperties) {
    return new StepBuilder("orderidFixerStep", jobRepository)
        .<Order, Order>chunk(appProperties.getBatchSizeToValidate(), transactionManager)
        .reader(orderIdReader)
        .writer(orderIdItemWriter)
        .chunk(appProperties.getBatchSizeToValidate())
        .build();
}

我担心的是我正在从同一张表中读取内容,然后写回同一张表。

这是否会导致任何不一致?
我不这么认为,因为因为我使用

JdbcCursorItemReader
,它为所有数据返回
Resultset
TYPE_FORWARD_ONLY
是默认值?),并且数据是使用
Cursor
获取的,因此它不会改变即使我正在更新行,也可以在
Resultset
中。
另外,我正在更新已经读取的一个块或一个批次的行,因此即使结果集发生更改,也不应该成为问题。对于将添加的任何新行也是如此。这些行将不会被处理(并且不需要根据要求进行处理),因为
ResultSet
不会有它们。

我的理解正确吗?

是否有任何极端情况或我在理解中遗漏的或我可能忽略的东西?

在我的测试中,它似乎工作正常,但我只是想检查是否有任何可能出错的地方。

有关数据的更多详细信息:
我有一个列,其中存储每个订单 id 的哈希值,即 1 个订单 id 的 1 个哈希值。

订单 ID 列位于不同的表中。

由于某种原因,某些行中的订单 ID 值已损坏,因此我需要循环所有订单 ID,使用某种算法计算哈希值,并检查它是否与另一个表中相应的哈希值匹配。

如果不匹配,那么我需要通过解析第三列中存储的具有原始订单 ID 的 JSON 来获取订单 ID。

哈希值或 JSON 不会更改,orderId 也不会更改。

所有这些数据都是只读的。

所有这些都位于同一个数据库中。

spring-batch spring-jdbc
1个回答
0
投票

默认情况下,游标将在其自己的连接中打开,并且不会参与为其余步骤处理启动的任何事务。您需要在

useSharedExtendedConnection
上设置
JdbcCursorItemReader
并将数据源包装在
ExtendedConnectionDataSourceProxy
中。 javadoc here中有关于此的注释。

© www.soinside.com 2019 - 2024. All rights reserved.