向 crate.io 发送 JDBC 批量插入时,返回值 -3 表示什么

问题描述 投票:0回答:2

我尝试使用 JDBC 对 Crate 实例进行批量插入:

    for(...) {
        statement.setLong(1, startTime);
        statement.setInt(2, i);
        ...
        statement.addBatch();
    }

    results = uaStatement.executeBatch();
    logger.info("Had bulk-result: " + Arrays.toString(results));

生成的 int[] 数组应包含 0 或 1,具体取决于该行是否插入。

但是我得到了很多“-3”,JDBC 标准和文档似乎都没有定义这些。

返回-3时,行似乎没有插入,但没有看到其他错误信息。看起来 -3 直接来自 Crate 服务器,客户端 JDBC 实现只是转发它。

这是带有 JDBC 驱动程序 2.2.0 的 crate 2.3.3

compile 'io.crate:crate-jdbc:2.2.0'

这说明什么?发送的值有问题吗?

Had bulk-result: [1, 1, 1, 1, -3, -3, -3, -3, -3, -3, 1, -3, -3, -3, -3, -3, -3, ...
java jdbc bulkinsert cratedb
2个回答
2
投票

请查看

java.sql.BatchUpdateException
的API文档(重点是我的):

批量更新中某个命令执行失败后

BatchUpdateException
被抛出,驾驶员可能会也可能不会继续 处理批处理中的剩余命令。如果司机 失败后继续处理,方法返回的数组
BatchUpdateException.getUpdateCounts
每个都会有一个元素 批处理中的命令,而不仅仅是命令的元素 错误发生之前执行成功。如果驾驶员 继续处理命令,任何命令的数组元素 失败的是
Statement.EXECUTE_FAILED

Statement.executeBatch()

值为

EXECUTE_FAILED
-- 表示该命令未能执行 成功执行,并且仅当驱动程序继续处理时才会发生 命令失败后的命令

-3
是常数
Statement.EXECUTE_FAILED
。在某些驱动程序中,这些执行失败的异常将链接到此
BatchUpdateException
(检查
getNextException
或迭代异常的所有可抛出项)。

但是,如果所有后续值都报告

Statement.EXECUTE_FAILED
,则可能意味着驱动程序实际上并未尝试执行剩余的参数集,而是简单地报告从第一次失败开始的所有参数集
Statement.EXECUTE_FAILED
。在这种情况下,驱动程序应该在第一次失败后“放弃”,只报告成功执行的参数集的更新计数,如 JDBC 规范和 API 文档中所述。


0
投票

如果抛出异常并且您想知道每个失败插入的异常到底是什么,您可以使用此 catch 块,它将打印失败的确切原因:

  catch (SQLException sqlException) {
        while (sqlException != null) {
            System.err.println("Error msg: " + sqlException.getMessage());
            sqlException = sqlException.getNextException();
        }
    } 
© www.soinside.com 2019 - 2024. All rights reserved.