#java #spring #jdbc #transactions
#java #spring #jdbc #транзакции
Вопрос:
Я обновляю загрузчик данных, который считывает данные из плоского файла и пакетной установки с использованием jdbctemplate для каждых 500 элементов. Я использую пул фиксированных потоков java executor, который отправляет задачи, которые выполняют чтение каждого файла и пакетное обновление. Например, при чтении первого файла, если он завершается неудачно во время 3-й пакетной операции, все предыдущие пакетные операции для этого файла должны быть откатаны. Задача должна быть продолжена со следующим файлом и создать новую транзакцию для вставки. Мне нужен был код, который может это сделать. В настоящее время я использую transactiontemplate и оборачиваю код batchinsert внутри doInTransactionwithoutcallback
и во время исключения в catch-блоке, вызывающем статус транзакции.setrollbackonly . Но мне нужен код, который может создать новую транзакцию для следующего файла независимо от того, произошел сбой или удался последний файл. установка значения распространения требует нового решает это?
Комментарии:
1. Вы должны попробовать Spring Batch. Он был создан для поддержки продвинутых сценариев, подобных этому.
Ответ №1:
Как прокомментировал Шон, вам не следует изобретать все заново и вместо этого использовать Spring Batch.
Пакет Spring Batch позволит вам:
- разделите выполнение (например, с помощью исполнителя пула потоков)
- сопоставьте записи в файле (файлах) с объектами
- установите правильный интервал фиксации, при котором будет зафиксирован «фрагмент» обработанных записей и откат в случае, если какая-либо из них «неправильная»
- укажите, какие ошибки можно пропустить, повторить
- и многое другое
И это уже есть => закодировано, протестировано и потрясающе.