java - 从 BatchUpdateException 确定每行执行失败的原因

标签 java mysql sql jdbc batch-updates

我有一个 java 程序,可以将文本文件中的数千行数据读取到数据库中。它使用语句批处理一次插入几千行。

如果任何行无法更新,我将继续尝试其余行,直到列表末尾。之后,我返回并检查哪些行失败,然后将这些行中的信息打印到日志文件中以供稍后检查。

我想知道如果由于重复条目而失败,是否有办法跳过打印失败的行。我可以接受重复失败,但如果插入由于其他原因失败,我需要将该行输出到我的日志文件中。

我目前的做法是:

int[] updateCounts;

try {
    // Do my batch updates by iterating through a vector of data
} catch (BatchUpdateException buE) {
    updateCounts = buE.getUpdateCounts();
}

for (int c = 0; c < updateCounts.length; ++c) {
    if (updateCounts[c] == Statement.EXECUTE_FAILED) {
        // Print data from the original data vector at index c 
    }   
}

我不想打印 updateCounts 为 EXECUTE_FAILED 的每一行,而是只想打印由于唯一键而没有的行。

在 Google、StackOverflow 和 BatchUpdateException 文档之间,我猜没有办法做到这一点。但如果有就好了,但我就是找不到。

最佳答案

可能有两个原因;

  1. SQL 查询中可能存在语法错误。
  2. 主键可能有重复条目。

当您从文本文件读取数据时,我建议您在 SQL 中使用加载数据本地 InFile 查询。这将解决上述两个问题,并且您的所有真实条目都将上传到数据库中。

如果这没有帮助,请将查询添加到您的问题中,堆栈跟踪将有助于回答。

关于java - 从 BatchUpdateException 确定每行执行失败的原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39947790/

相关文章:

java - gradle测试错误:retrolambda.oldJdk

php - 存在时获取数据库时,如何在每三个结果后动态添加 DIV 类 ="clear"

sql - 在 Postgres 中提取小于 mm-dd 的所有年份的日期

sql - 生成 SQL 字符串的 Rust 函数是否容易受到 SQL 注入(inject)的攻击?

java.lang.NoClassDefFoundError :javax/xml/bind/JAXBContext 错误

java - 如何获取 HashMap 的第一个键?

Java SuperClass 和 SubClass 扩展可比较

php - mysqli bind_param 更新查询不起作用

javascript - 服务器上每秒更新 MYSQL 值

mysql - 查询选择在日期范围之间有重复数据