【问题标题】:How DB connections and transactions will be maintained in SpringBatch如何在 Spring Batch 中维护 DB 连接和事务
【发布时间】:2016-07-18 17:53:30
【问题描述】:

我有一个用例,例如,

  1. 从多个表中读取批量记录(超过10000条记录)
  2. 验证记录的业务逻辑
  3. 将经过验证的记录更新到其他表,而不是在同一数据库中检索记录的位置。

我想使用 Spring Batch 和调度程序来实现我的用例以运行 某个时间点。

我已阅读有关 Spring Batch 的信息,并了解有一个 ItemReaderItemProcessorItemWriter 作为块中的作业来执行活动。 我也想通过定义taskExecutor(org.springframework.core.task.SimpleAsyncTaskExecutor)来使用多线程来实现它。我决定采用以下方法

  1. 使用ItemReader 中的spring hibernate 事务管理器调用其他模块中实现的DAO,通过查询从DB 中读取记录。
  2. ItemProcessor 中一次处理每个记录
  3. 将记录更新到ItemWriter 中的表,提交间隔为某个数字。

我是 Spring 批处理的新手,所以我想了解这是否是一个很好的实现解决方案,或者是否有更好的方法来实现它。关于如何维护数据库连接和事务,我也有一些疑问。

整个批处理作业是否只有一个连接和事务?还是会在某些执行点打开多个连接和事务?这个过程将如何处理?

如何有效地使用多线程处理上述用例以一次处理10或20个线程的记录?

有人可以提供一个简短的解释来了解更多关于这个概念或提供任何示例来了解更多吗?

提前致谢。

【问题讨论】:

    标签: java spring hibernate spring-batch spring-transactions


    【解决方案1】:

    你的方法对我来说听起来不错。

    我会尽量回答你的第一个问题。

    整个批处理作业是否只有一个连接和事务?还是会在某些执行点打开多个连接和事务?这个过程将如何处理?

    您可以拥有多个数据源和多个事务管理器,但管理它会很困难,因为您必须处理 Spring 批处理管理器可以自己完成的许多事情。 由于大多数 Spring Batch 操作(如 Restart 、 stop 等)需要元数据,这些元数据由 Spring Batch 存储在 Db 中。如果您尝试使用它,那么这些操作可能效果不佳。

    我建议您将 spring 批处理表和您的业务特定表放在同一个数据源中。 这样一来,您只需要一个数据源和一个事务管理器,就不必担心可能面临的事务问题。

    【讨论】:

      猜你喜欢
      • 2018-03-02
      • 2011-09-25
      • 2015-01-01
      • 1970-01-01
      • 2019-10-18
      • 2015-09-19
      • 1970-01-01
      • 2012-07-31
      • 2012-12-19
      相关资源
      最近更新 更多