JDBC Bath - ERROR Batch entry 295 <unknown> was aborted: Возвращено слишком много результатов обновления. В чем проблема?

155
31 марта 2019, 23:00

Есть много одинаковых запросов insert, и для ускорения выполнения этих процессов, я хочу использовать statement.executeBatch();

вот часть кода:

public void executeRequest() {
    try {
        statement.executeBatch();
        connection.commit();
    } catch ( SQLException e) {
        log.error(e.getMessage());
    }
}
public void addBatch(String request){
    try {
        statement.addBatch(request);
    } catch (SQLException e) {
        log.error(e.getMessage());
        log.error("\n\n"+request);
    }
}

Но в результате получаю ошибку:

2018-11-06 10:13:49 ERROR SettingDataBase:39 - Batch entry 295 was aborted: Возвращено слишком много результатов обновления. Call getNextException to see other errors in the batch.

На сколько я знаю, batch ограничен только размером памяти. В чем может быть проблема и как ее исправить?

Пример записи в batch:

INSERT INTO "C_Parameters" ("DefaultValue", "DeletionMark", "Ref", "Description", "ValueType", "Code")
VALUES ('<?xml version="1.0" encoding="UTF-8"?><Value><Type>Catalog.дом</Type><Data>00000000-0000-0000-0000-000000000000</Data></Value>', 'false', '15a4242d-adf9-4cef-8e40-ce1d64e2dde2', 'Обслуговує агент', 'eJxdUL0KwoDCGNzjw==', '000000023')
ON CONFLICT ("Ref") DO UPDATE SET
"DefaultValue" = '<?xml version="1.0" encoding="UTF-8"?><Value><Type>Catalog.дам</Type><Data>00000000-0000-0000-0000-000000000000</Data></Value>',
"DeletionMark" = 'false',
"Ref" = '14a3242d-adf4-4cef-8e40-ce4d64e2dde2',
"Description" = 'Тест',
"ValueType" = 'eJxdUL0KwjAQ3n2KKBNd6pxL==',
"Code" = '000000023'; 
Answer 1

C Batch все таки обычно работают по другому, а именно:

  1. Создаем PreparedStatement
  2. В цикле задаем параметры PreparedStatement и добавляем addBatch()
  3. Выполняем executeBatch()

Примерно так:

    PreparedStatement preparedStatement;
    String compiledQuery = "INSERT INTO TESTDB.EMPLOYEE(EMPNO, EMPNM, DEPT, RANK, USERNAME)" +
            " VALUES" + "(?, ?, ?, ?, ?)";
    preparedStatement = connection.prepareStatement(compiledQuery);
    for(int index = 1; index <= records; index++) {
        preparedStatement.setInt(1, index);
        preparedStatement.setString(2, "empo number-"+index);
        preparedStatement.setInt(3, index+100);
        preparedStatement.setInt(4, index+200);
        preparedStatement.setString(5, "usernames");
        preparedStatement.addBatch();
    }
    int[] inserted = preparedStatement.executeBatch();
READ ALSO
Приложение на Java для работы с БД [закрыт]

Приложение на Java для работы с БД [закрыт]

Я новичок в java программировании и совсем недавно начал изучать javaПростые вещи на java понятны (такие как создание классов, условия, циклы, коллекции,...

158
Метод вывести массив в консоль с использованием дженериков [закрыт]

Метод вывести массив в консоль с использованием дженериков [закрыт]

Необходимо реализовать метод с использованием обобщенных параметров типа, который в качестве аргумента будет принимать массив и выводить...

175
Поиск по словосочетанию SearchView &amp; ArrayList &amp; ListView

Поиск по словосочетанию SearchView & ArrayList & ListView

Использую SearchView и стандартный адаптер ArrayAdapter, с помощью adaptergetFilter()

156