JdbcBatchItemWriterBuilder против org.springframework.jdbc.core.JdbcTemplate.batchUpdate

#spring #spring-boot #spring-batch #spring-jdbc #jdbctemplate

#весна #весенняя загрузка #весна-пакет #весна-jdbc #jdbctemplate

Вопрос:

Я понимаю, что JdbcTemplate.batchUpdate используется для отправки нескольких записей в базу данных за одно сообщение. Допустим, у меня есть 1000 записей для обновления, вместо 1000 сообщений от приложения к базе данных приложение отправит 1000 записей в запросе.

Переход к JdbcBatchItemWriterBuilder — это комбинация задач в задании.

Мой вопрос в том, если через JdbcBatchItemWriterBuilder необходимо обработать 1000 записей (инструкции ВСТАВКИ), все ВСТАВКИ выполняются за один раз? или один за другим?

Если одно за другим подключение к базе данных 1000 раз с использованием JdbcBatchItemWriterBuilder вызывает проблемы с производительностью? как это обрабатывается?

я хотел бы понять, работает ли Spring batch лучше, чем запуск 1000 вставок с использованием JdbcTemplate.update?

Ответ №1:

JdbcBatchItemWriter Использование java.sql.PreparedStatement#addBatch и java.sql.Statement#executeBatch внутреннее (см. https://github.com/spring-projects/spring-batch/blob/c4010fbffa6b71cbcfe79d523023251ce73666a4/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/JdbcBatchItemWriter.java#L189-L195) , таким образом, будет одна пакетная вставка для всех элементов блока.

Более того, это будет выполнено за одну транзакцию, как описано в разделе «Обработка, ориентированная на фрагменты» справочной документации.

Комментарии:

1. Спасибо за ответ. если в одном блоке 1000 элементов, а в 100-й строке не удалось вставить, можем ли мы заставить работать оставшиеся 900 операторов вставки?

2. если я использую 1 элемент в блоке для лучшей обработки исключений, я не использую возможности пакетной обработки. верно?

3. Ваш первоначальный вопрос был не о случае сбоя. Если во время записи произойдет исключение с возможностью пропуска, пакет Spring будет сканировать блок на предмет неисправного элемента (другие элементы будут выполняться в отдельных транзакциях каждый). Если вы используете set commit-interval=1 , вы не будете получать пакетные обновления (у вас будет 1000 транзакций вместо 1). Пожалуйста, примите ответ, если он помог (я считаю, что он ответил на ваш первоначальный вопрос).