#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). Пожалуйста, примите ответ, если он помог (я считаю, что он ответил на ваш первоначальный вопрос).