0

我尝试使用 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 的板条箱 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, ...
4

1 回答 1

2

请检查java.sql.BatchUpdateException(强调我的)的API文档:

在批量更新中的命令未能正确执行并 BatchUpdateException抛出 a 后,驱动程序可能会或可能不会继续处理批处理中剩余的命令。如果驱动程序在失败后继续处理,则该方法返回的数组 BatchUpdateException.getUpdateCounts将为批处理中的每个命令都有一个元素,而不仅仅是在错误之前成功执行的命令的元素。在驱动程序继续处理命令的情况下,任何失败的命令的数组元素都是Statement.EXECUTE_FAILED.

Statement.executeBatch()

-- 值EXECUTE_FAILED表示命令执行失败,只有在命令失败后驱动程序继续处理命令时才会发生

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

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

于 2018-02-22T12:53:58.217 回答