#spring-boot #spring-batch #spring-jdbc #jdbctemplate
#spring-boot #spring-batch #spring-jdbc #jdbctemplate
Вопрос:
Я хочу удалить из 6 таблиц, и в них миллионы записей.. Итак, я хочу удалять пакетами. в настоящее время я использую jdbcTemplate.batchUpdate(deleteQueryArray)
Иногда это может привести к взаимоблокировке, поэтому я хочу удалять партиями размером x, которые будут хорошо масштабироваться.
Запросы:
DELETE FROM BATCH_STEP_EXECUTION_CONTEXT
WHERE STEP_EXECUTION_ID IN (SELECT BE.STEP_EXECUTION_ID
FROM BATCH_STEP_EXECUTION BE
JOIN BATCH_STEP_EXECUTION_CONTEXT BEC ON BE.STEP_EXECUTION_ID = BEC.STEP_EXECUTION_ID
WHERE LAST_UPDATED < '2020-11-01 00:00:00'),
DELETE FROM BATCH_STEP_EXECUTION
WHERE JOB_EXECUTION_ID IN (SELECT JOB_EXECUTION_ID
FROM BATCH_JOB_EXECUTION
WHERE LAST_UPDATED < '2020-11-01 00:00:00'),
DELETE FROM BATCH_JOB_EXECUTION_PARAMS
WHERE JOB_EXECUTION_ID IN (SELECT JOB_EXECUTION_ID
FROM BATCH_JOB_EXECUTION
WHERE LAST_UPDATED < '2020-11-01 00:00:00')
DELETE FROM BATCH_JOB_EXECUTION
WHERE LAST_UPDATED < '2020-11-01 00:00:00'
DELETE FROM BATCH_JOB_INSTANCE
WHERE JOB_INSTANCE_ID NOT IN (SELECT JOB_INSTANCE_ID
FROM BATCH_JOB_EXECUTION)
Итак, я вижу 2 подхода.
-
найдите максимальный идентификатор задания из выполнения задания, подлежащего удалению, а затем разделите его на допустим, коэффициент 10 и выполните цикл 10 раз, чтобы удалить из 6 таблиц (выполнение задания и соответствующие записи шагов дочерней таблицы). используя одно и то же пакетное обновление
-
Используя пакетное обновление spring из каждой таблицы, используйте опцию batch для удаления и укажите размер пакета для Spring batch для пакетного удаления. Я думаю, что этот подход займет больше времени, чем подход 1.
Может кто-нибудь, пожалуйста, поделитесь своей мыслью, каков наилучший подход здесь, спасибо
Комментарии:
1. Почему это приводит к тупиковой ситуации? Вы выполняете эти запросы в одной транзакции?
Ответ №1:
После каждого цикла выставления счетов у нас есть миллионы данных, и у нас есть процедура sql, в которой есть все таблицы со ссылками FK и итерации в цикле for. Это вызывается отдельным заданием. Я думаю, что решение в этом случае должно основываться на операционной деятельности бизнеса и на том, как часто это необходимо выполнять.
Комментарии:
1. Это должно выполняться один раз в день. Это обычное действие по очистке старых данных.