【问题标题】:Spring Batch, Chunk Size and Skip Listener togetherSpring Batch、Chunk Size 和 Skip Listener 一起使用
【发布时间】:2017-07-23 20:24:01
【问题描述】:

我有一个 spring 批处理应用程序,它运行良好。它只是从文本文件中读取并写入 oracle 表。它在卡盘中执行加载。目前我已经配置了 2000 的卡盘大小。问题是,当我为这项工作实现跳过侦听器时,弹簧忽略了我给出的块大小,它一次只将一条记录插入数据库。跳过侦听器只是将无效记录写入文本文件。这是春季批处理的工作原理吗?

【问题讨论】:

  • "它一次只插入一条记录到数据库中。" - 你确定每次都是在单独的交易中完成的吗?事务边界所需的块。
  • 我只是使用spring提供的JdbcBatchItemWriter。我没有写任何与交易相关的代码。我刚刚将 JPATransactionManager 配置为 spring bean。

标签: spring spring-batch


【解决方案1】:

在一个块中,ItemWriter 将始终首先尝试写入该块中的整个项目列表。但是,如果抛出可跳过的异常,框架需要找出导致错误的项。

为此,事务被回滚,然后项目被逐一重试。这允许将可能导致问题的任何项目传递给您的跳过侦听器。不幸的是,它也消除了块的批处理性。

一般来说,最好(并且会更好)在处理器中进行预先验证,这样您就可以“过滤”出项目,而不是抛出异常并单独重试项目。

【讨论】:

  • 其实我的可跳过异常是SQLExceptions。例如,如果我插入特定列的值超过了最大长度。我们将得到 SQLException。我将此例外设为可跳过。我们无法在处理器中进行此类验证。它只能在 Writer 类中完成。没有办法,我们可以在 spring 中实现批量和跳过功能吗?
  • 您绝对可以检查处理器中的字段长度。一种选择是检查每个字段并在必要时截断。或者,您可以利用基于注释的验证(例如@Column(nullable=false, length=12))丢弃(过滤)您知道无法插入的项目。
猜你喜欢
  • 1970-01-01
  • 2018-10-26
  • 1970-01-01
  • 2019-09-01
  • 2018-05-14
  • 2019-01-29
  • 2017-08-20
  • 2012-06-19
  • 2021-06-26
相关资源
最近更新 更多