Что указывает возвращаемое значение -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();
        }
    } 
Другие вопросы по тегам