Исключения обработки Spring JdbcTemplate batchUpdate

В настоящее время наш код использует метод batchUpdate JdbcTemplate для пакетной вставки.

Мой вопрос: в случае какого-либо исключения в одном из обновлений, как с ним справиться (предположим, просто добавив журнал) и продолжить со следующими инструкциями обновления sql?

Также как метод batchUpdate() для JdbcTemplate обрабатывает исключения?

Фрагмент здесь.

    /**
     * Saves the list of <code>Item</code> objects to the database in a batch mode
     * 
     * @param objects
     *    list of objects to save in a batch mode
     */
    public void save(final List<Item> listOfItems) {

        for (List<Debit> list : listOfItems) {
            getJdbcTemplate().batchUpdate(insertItem, new ItemBatchPreparedStatementSetter(list));
        }
    }

person minil    schedule 21.03.2012    source источник
comment
Обрабатывать ошибки в пакетных обновлениях непросто, и у этой проблемы нет единого решения. Это зависит от того, как вы хотите с этим справиться.   -  person skaffman    schedule 21.03.2012
comment
@skaffman Знаете ли вы способ обработки ошибок пакетных обновлений Spring? Когда используется преобразование исключений, кажется, что первое обнаруженное преобразование преобразуется и генерируется, поэтому возвращаемые счетчики обновлений теряются. Это очень странно.   -  person Mickael Marrache    schedule 09.06.2014


Ответы (2)


как метод batchUpdate() для JdbcTemplate обрабатывает исключения?

Поведение пакетного обновления не определено в JDBC:

Если одна из команд в пакетном обновлении не выполняется должным образом, этот метод создает исключение BatchUpdateException, и драйвер JDBC может продолжить или не продолжить обработку оставшихся команд в пакете.

Вы должны проверить это поведение с вашей СУБД.

В любом случае BatchUpdateException будет перехвачено Spring и повторно сгенерировано как RuntimeException после некоторой очистки (см. подробности реализации здесь).

Вся эта логика будет переплетена с транзакциями - например. если вставка находится в пределах границ транзакции и вы перебрасываете RuntimeException через границы транзакции - транзакция (и все успешные вставки с ней) будут отброшены.

Поэтому желаемая пакетная логика «только строки ошибок» не может быть эффективно реализована без дополнительных знаний о вашей СУБД и поведении драйвера JDBC при ошибках во время пакетных вставок.

person alexkasko    schedule 22.03.2012

Я столкнулся с той же проблемой, что spring jdbc останавливает вставку в случае какой-либо записи об ошибке и не продолжает вставку. Ниже моя работа: -

// divide the inputlist into batches and for each batch :-
for (int j = 0; j < resEntlSize; j += getEntlBatchSize()) {
            final List<ResEntlDTO> batchEntlDTOList = resEntlDTOList
                    .subList(
                            j,
                            j + getEntlBatchSize() > resEntlSize ? resEntlSize
                                    : j + getEntlBatchSize());
            TransactionDefinition def = new DefaultTransactionDefinition();
            TransactionStatus status = transactionManager
                    .getTransaction(def);
            try {
                //perform batchupdate for the batch
                transactionManager.commit(status);
            } catch (Exception e) {
                transactionManager.rollback(status);
                //perform single update for the error batch
            }

        }
person user2796913    schedule 15.04.2014