我编写了一个单线程
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 也不会更改。
所有这些数据都是只读的。
所有这些都位于同一个数据库中。
默认情况下,游标将在其自己的连接中打开,并且不会参与为其余步骤处理启动的任何事务。您需要在
useSharedExtendedConnection
上设置 JdbcCursorItemReader
并将数据源包装在 ExtendedConnectionDataSourceProxy
中。 javadoc here中有关于此的注释。