Эффективный способ массовой загрузки и обновления с использованием пружинных данных jpa (hibernate) - PullRequest
0 голосов
/ 11 апреля 2020

Я использую весеннюю загрузку (2.2.1) вместе с пружинными данными jpa.

В моем приложении запущена служба по расписанию, в которой я должен читать миллионы данных клиентов (с нумерацией страниц) для нескольких компаний. И после выполнения некоторых операций я должен обновить столбец состояния для этих пользователей. Для обновления статуса я использую собственный запрос (с использованием @Query аннотации и nativeQuery=true).

public void scheduledTask() {
  List<Integer> companies = getCompanies();
  for each company:
      1. get x customers
      2. do some operation

    3. repeat step 1 -> 2 for all customers in a company 
       and then update the read status for the customers
}

После обработки некоторых записей клиентов состояние чтения не обновляется для обработанных записей, если есть какие-либо исключения. Кроме того, если обрабатывается несколько миллионов записей о клиентах, hibernate entity manager закрывается.

При выполнении вышеуказанного процесса статус чтения обновляется только после обработки всех клиентов всех компаний.

Сейчас, Я хочу знать, есть ли эффективный способ загрузки и обновления данных клиента, чтобы в случае исключения мое обновление статуса чтения не потерялось.

1 Ответ

0 голосов
/ 11 апреля 2020

Лучшее решение для этого во многом зависит от того, что означает «выполнить какую-либо операцию» и с какими причинами исключений приходится иметь дело. Поскольку мы этого не знаем, я буду придерживаться некоторых общих советов.

  1. Чтобы ваши изменения не откатывались, поместите их в отдельные транзакции.

  2. Избегайте тонны мелких транзакций. Каждая транзакция вынуждает базу данных выполнять некоторые операции ввода-вывода, что снижает производительность. С крупными транзакциями также могут возникнуть некоторые проблемы.

  3. Избегайте JPA для такого рода работы. Сила JPA - это операции CRUD, в которых вы загружаете один или несколько объектов, меняете их и отправляете изменения sh в базу данных. Для массовых пакетных операций, как мы здесь придерживаемся JDB C и SQL. Это значительно снижает накладные расходы.

  4. Изучите специальные инструменты для пакетных операций, такие как Spring Batch.

  5. Относительно исключений: старайтесь избегать их. Или, по крайней мере, избегайте их пересечения границ вашей транзакции. Вы можете изучить стратегии повторных попыток, когда вы сначала пробуете пакет клиентов, и если пакет генерирует исключение, обрабатывайте их одно за другим, поэтому только тот, который вызывает исключение, не проходит через этот процесс.

...