即使插入某些记录失败,如何在数据库中插入行

时间:2017-09-03 12:17:58

标签: java mysql spring spring-batch

我正在处理一个spring批处理,我希望能够在数据库中插入行,即使它无法在其中插入一些行。我不明白即使没有插入一条记录,如果作业失败,如何让批处理更新/插入行。

我使用insert / update查询来推送数据库中的数据。

3 个答案:

答案 0 :(得分:0)

ignore关键字与插入和更新(insert ignore ...)一起使用downgrade most errors to warnings

  

MySQL中的几个语句支持可选的IGNORE关键字。此关键字会导致服务器降级某些类型的错误并生成警告。对于多行语句,IGNORE会使语句跳到下一行而不是中止。

这样,错误不会导致整体插入和更新失败,您可以稍后通过调用show warnings来检索任何问题。

答案 1 :(得分:0)

设计非阻塞作业非常重要。 在批处理中,我们的想法是使用try catch块包围持久性指令,然后记录错误或执行某些操作来跟踪错误。 它让你知情,不受阻。

答案 2 :(得分:0)

由于您使用的是弹簧批,因此可以使用SkipPolicy

public class InsertToDatabaseSkip implements SkipPolicy {

    private static final Logger logger = LoggerFactory.getLogger("InsertToDatabaseSkipLogger");

    @Override
    public boolean shouldSkip(Throwable exception, int skipCount) throws SkipLimitExceededException {
       if (exception instanceof SQLException) {
          logger.error(exception.getMessage());
          return true;
       } else {
         return false;
       }
  }
}

然后将其添加到您的配置

<batch:skip-policy>
   <bean class="com.skip.package.InsertToDatabaseSkip" scope="step"/>
</batch:skip-policy>

请参阅:https://docs.spring.io/spring-batch/trunk/apidocs/org/springframework/batch/core/step/skip/SkipPolicy.html