Что указывает возвращаемое значение -3 при отправке массовой вставки JDBC в crate.io
Я пытаюсь сделать пакетную вставку с 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 на стороне клиента просто продвигает это.
Это ящик 2.3.3 с драйвером JDBC 2.2.0
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, ...
2 ответа
Пожалуйста, проверьте API документацию java.sql.BatchUpdateException
(выделение мое):
После того, как команда в пакетном обновлении не выполняется должным образом и
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();
}
}