3

我正在尝试使用 Spring 实现业务需求,并且在事务管理方面存在一些问题。

简单地说,业务需求是
1) 使用一些标准查询数据库 (#1)。
2) 将查询结果写入平面文件。
3) 将数据库(#1) 中的那些记录更新为“已处理”。
4) 作为前 3 步的结果,将记录插入另一个数据库(#2)。

我需要这 4 个步骤是超制裁的。例如,如果第 4 步失败,则应回滚在第 2 步中写入平面文件的最后一项。我找到了“Apache Commons File Resource Manager”来实现文件回滚机制。

我的导师建议我在这类项目中普遍使用 Spring Batch。然而,考虑到 Spring Batch 使用“面向块的处理”风格,用 Spring Batch 实现它看起来相当困难。因为,据我所知,面向块的样式需要为整个块完成第二步,然后它允许在我的实现中继续进行第三步和第四步。

我想我需要一些关于这个项目的一般建议,以及是否为此目的使用 Spring Batch。此外,尝试在并发环境中实现这些需求是否是一个好主意,因为回滚机制对于这种风格将非常复杂。

4

2 回答 2

3

批处理的目的是将您尝试做的事情分解成可以单独处理(顺序或并行)的小工作单元。Spring Batch 是一个框架,它为您提供构建在 Spring 之上的灵活机制,允许您执行批处理样式处理。根据您的要求,您可以配置 Spring 批处理以多种不同方式执行。您提到的面向块的处理只是可以使用 Spring 批处理的一种方式。

如果我查看您提供的信息,以下是我看到的您的应用程序的元素:

  • 从数据库中读取需要处理的记录
  • 处理记录,这会导致 db #2 被更新
  • 将记录标记为已处理
  • 将记录写入已处理的文件

你会注意到我稍微重新安排了事件的顺序。我描述的逻辑非常适合批处理式处理。这是一个如何使用 Spring 批处理管理此处理的示例:

  1. 从数据库中检索要处理的记录。检索将通过自定义数据库检索器完成。这些记录将被 Spring Batch 用作记录选择器。然后,您将配置 Spring 批处理以迭代此列表。
  2. 您将配置 Spring 批处理的下一步以处理在步骤 1 中检索到的每个记录。此处理将包括处理单个记录并将结果写入第二个数据库。
  3. 您的最后一步是结束个人记录的处理。与大多数 Spring 框架一样,当发生这种情况时,您可以通过多种不同的方式进行配置。这最后一步将执行两个功能:将 db #1 中的记录更新为已处理并将已处理的记录写入输出文件。输出文件的写入可以在整个批处理过程完成后作为第 4 步执行,您将在其中查看在当前运行期间标记为已处理的记录并根据需要写入数据。

Spring Batch 确实允许您配置在整个处理过程中如何管理事务,因此您可以配置一个跨越所有操作的事务,如果文件写入失败,则可以将其配置为回滚其余的数据库操作。

使用这种方法,您可以按顺序、并行等方式处理记录。但是,所有这些都假设您可以将数据分解为更小的工作单元。如果不是这种情况,那么批处理并不是真正可以执行的事情,因为您只有一个进程。

我想说有一个简单的答案来决定是否使用 Spring 批处理。这是一个可以让你做很多事情的平台。除了这种灵活性外,它确实具有相对较高的学习曲线。

希望这可以帮助。

于 2011-03-03T19:00:37.800 回答
0

我想说 Spring 的方法是实现SpringPlatformTransactionManager抽象的平面文件版本,该版本将阻止文件写入,直到事务提交。应该不会太难。

于 2011-03-03T13:46:38.480 回答