2017-03-03 44 views
0

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

+0

”它一次只插入一条记录到数据库中。“ - 你确定每次都是在单独的交易中完成的吗?交易界限所需的块。 –

+0

我只是使用spring提供的JdbcBatchItemWriter。我不写任何交易相关的代码。我刚刚配置了一个JPATransactionManager作为spring bean。 – Vasanthakumar86

回答

0

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

要做到这一点,事务回滚,然后逐项重试项目。这允许任何可能导致问题的项目传递给跳过监听器。不幸的是,它也消除了块的批处理。

通常,在处理器中进行预先验证是可取的(并且性能会更好),因此您可以“过滤”这些项目而不是抛出异常并单独重试项目。 “

+0

实际上,我的可跳过的异常是SQLExceptions。例如,如果我插入特定列的值超过最大长度。我们将得到SQLException。我将这个例外视为可跳过的。这些验证我们无法在处理器中完成。它只能在Writer类中完成。没办法,春天我们可以实现批量跳过功能吗? – Vasanthakumar86

+0

你*绝对*可以检查处理器中的字段长度。一种选择是检查每个字段并在必要时截断。或者,您可以利用基于注释的验证(例如'@Column(nullable = false,length = 12)')来丢弃(过滤)您知道无法插入的项目。 –