我尝试使用 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.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 文档中所述。
如果抛出异常并且您想知道每个失败插入的异常到底是什么,您可以使用此 catch 块,它将打印失败的确切原因:
catch (SQLException sqlException) {
while (sqlException != null) {
System.err.println("Error msg: " + sqlException.getMessage());
sqlException = sqlException.getNextException();
}
}