【问题标题】:Determine cause of execute failure per row from BatchUpdateException从 BatchUpdateException 确定每行执行失败的原因
【发布时间】:2016-10-09 19:41:51
【问题描述】:

我有一个 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 的文档之间,我猜没有办法做到这一点。但是如果有就更好了,我就是找不到。

【问题讨论】:

    标签: java mysql sql jdbc batch-updates


    【解决方案1】:

    可能有两个原因;

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

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

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

    【讨论】:

    • 也许我在这个问题上并不清楚:现在该程序在功能上按我想要的方式工作,但我记录的比我想要的要多。目前即使一个条目失败了插入后。只是现在我正在记录每一个失败的行,我想找出哪些失败的行,因为它们是重复的,而不是记录那些,因为这些对我来说很好。但是您说失败的唯一其他原因是语法错误。由于一行不太可能出现语法错误,我认为我可以安全地停止记录任何失败的行并假设它们都是重复的。
    • 你能在这里添加堆栈跟踪吗?
    • 我不确定堆栈跟踪将如何提供帮助...这是一个 BatchUpdateException,我知道它来自哪一行。 BatchUpdateException 的 getMessage() 方法告诉我一行因唯一键而受到批评,但该消息仅适用于一个(我相信是最后一个)失败。
    猜你喜欢
    • 1970-01-01
    • 2014-09-22
    • 2019-06-29
    • 1970-01-01
    • 2020-11-27
    • 1970-01-01
    • 2016-05-16
    • 2020-08-28
    • 2018-08-05
    相关资源
    最近更新 更多