1

我有批处理步骤,我在其中读取文件,处理文件并将其保存到数据库。但由于它是满载的,因此我必须在插入新记录之前从数据库中删除表。

我的问题是,什么地方最适合编写代码来删除spring批处理中的现有表(读取器、处理器、写入器),以下是多个场景:

  1. open()在阅读器类的方法中执行此ItemReader<>操作: 问题:如果我正在阅读的文件以某种方式损坏或空白,那么在这种情况下,我将得到空表。

  2. 创建一个标志,设置一次,然后根据该标志删除处理器类中的表:可以这样做,但是有没有其他更好的方法或更好的速度来做到这一点

  3. 创建另一个临时表,将文件中的所有记录复制到该表中,然后在“@AfterStep”方法中,从实际表中删除所有记录,并将临时表中的所有记录移动到该表中。

是否有任何方法只在 之前被调用一次Itemprocessor,然后使用标志执行它?请建议

4

2 回答 2

0

在我看来,您在这里有两个步骤:

  1. 截断现有表。
  2. 从文件中插入数据。

您需要决定首先执行哪个步骤。

如果要先执行“截断”步骤,可以在执行截断之前添加检查以验证文件。例如,您可以使用 a@BeforeStep检查文件是否存在、是否可读且大小不是 0。

如果您需要保证在加载数据库表之前解析整个文件没有错误,那么您需要将数据解析到您提到的某个临时位置,然后在第二步中将数据从临时位置移动到最终位置桌子。我在那里看到了一些选择:

  1. 按照您的建议创建一个临时表来保存数据。读取文件后,在不同的步骤中,截断目标表并从临时表移动到目标表。
  2. 添加“createdDateTime”列或类似于现有表的内容和“executionDate”作业参数。然后在解析时插入新行。在第二步中,删除创建时间小于 executionDate 的所有行(假设您正在为表上的 PK 使用生成的 ID)。
  3. 将“状态”列添加到现有表中。将新行插入为“待定”。然后在第二步中,删除所有“活动”的行并将“待定”的行更新为“活动”。
  4. 将解析后的数据存储在内存中。这很危险,有几个原因;特别是如果文件很大。这也消除了重新启动失败作业的能力,因为内存中的数据将在失败时丢失。
于 2013-10-09T14:48:12.243 回答
0

你可以:

  • 创建 2 个具有相同架构的表 Data 和 DataTemp
  • 拥有现有数据的表数据
  • 复制 DataTemp 上的新数据

如果存储在 DataTemp 上的新传入数据有效,则可以将其传输到表 Data。如果您没有太多数据,您可以在另一个 Tasklet 上的单个事务中进行此传输。如果你有很多数据,你可以使用块处理 tasklet。当您插入它时,您知道它没有损坏并尊重数据库约束,因此如果传输失败(可能是因为数据库已关闭),您可以稍后重新启动它而不会丢失任何数据。

您还可以通过使用 2 个表并在您的配置中使用应该使用 2 个表(活动表)来避免该传输部分。或者,您可以使用更新的表别名/视图来引用活动表。

于 2013-10-09T15:29:11.820 回答