如果一条记录在 oracle 中插入失败,则避免 jdbc 批量插入失败

Posted

技术标签:

【中文标题】如果一条记录在 oracle 中插入失败,则避免 jdbc 批量插入失败【英文标题】:avoid jdbc batch insert failure if one record failed to insert in oracle 【发布时间】:2018-09-26 10:17:09 【问题描述】:

如果在批处理过程中发生错误,Oracle JDBC 驱动程序将引发 BatchUpdateException。使用 NamedParameterJdbcDaoSupport 插入数据如下

getJdbcTemplate().batchUpdate(query, dataList, 1000,
  new ParameterizedPreparedStatementSetter<MyObject>() 
     @Override
     public void setValues(final PreparedStatement ps, final MyObject bucket) throws SQLException 
       ps.setString(1, bucket.getInit());
       ps.setString(2, bucket.getNbr());                  
    
);

由于唯一键约束,我遇到了 BatchUpdateException,我们正在处理数百万条记录,因此我们无法去数据库检查唯一键。

如果一条记录失败,无论如何批量插入不会失败。

【问题讨论】:

有没有什么方法可以在将数据发送到 Oracle 之前对其进行清理,这样这样的故障就不太可能发生? 当我们处理数百万条记录时,我们不知道哪条记录是重复的。如果是空指针或类似的异常,我们只能在代码中处理 那我没有答案。也许使用较小的批次,这样如果一个批次失败,您不必回滚所有内容。 是的,我会接受你的建议..尝试从批处理中删除失败的记录并重新插入。 【参考方案1】:

您想使用IGNORE_ROW_ON_DUPKEY_INDEX 提示。 在插入后添加注释,如下所示。

insert /*+ IGNORE_ROW_ON_DUPKEY_INDEX(table_name, unique_index_name) */
       (...)

但如果您以这种方式插入一百万行,则最好使用 sqlldr。

【讨论】:

以上是关于如果一条记录在 oracle 中插入失败,则避免 jdbc 批量插入失败的主要内容,如果未能解决你的问题,请参考以下文章

oracle中plsql练习题----查询姓为“SMITH”的员工信息,并输出其员工号姓名工资部门号。 – –如果该员工不存在,则插入一条新记录,员工号为2012,员工姓名为“Smith”,工(代码

Oracle常用的SQL方法总结

mysql判断一条记录是否存在,如果存在,则更新此语句,如果不存在,则插入

HSQLDB -Query - 如果不存在则插入第一条记录

事务:从短信平台插入短信模板与从运营平台插入短信模板

尝试插入重复记录后,如果不存在则插入失败