我正在处理一个spring批处理,我希望能够在数据库中插入行,即使它无法在其中插入一些行。我不明白即使没有插入一条记录,如果作业失败,如何让批处理更新/插入行。
我使用insert / update查询来推送数据库中的数据。
答案 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>