Общий вопрос транзакции, касающийся многих записей - PullRequest
1 голос
/ 08 марта 2011

Я работаю с новой для меня кодовой базой, которая использует iBatis. Мне нужно обновить или добавить существующую таблицу, и она может включать более 20 000 записей. Процесс будет выполняться один раз в день и выполняться ночью.

Я получаю данные от вызова веб-служб. Я планирую получить данные, затем заполнить один объект типа модели для каждой записи и передать каждый объект типа модели какому-либо методу, который будет считывать данные в объекте, и обновлять / вставлять данные в таблицу.

Пример:

ArrayList records= new ArrayList();
Foo foo= new Foo();
foo.setFirstName("Homer");
foo.setLastName("Simpson");
records.add(foo);
//make more Foo objects, and put in ArrayList.

updateOrInsert(records); //this method then iterates over the list and calls some method that does the updating/inserting

Мой главный вопрос - как обрабатывать все обновления / вставки как транзакции. Если система выйдет из строя до того, как все записи будут прочитаны для обновления / вставки таблицы, мне нужно знать, поэтому я могу вернуться к вызову веб-служб и повторить попытку, когда система в порядке.

Я использую Java 1.4, а БД - Oracle.

1 Ответ

0 голосов
/ 09 марта 2011

Я настоятельно рекомендую вам использовать пружинную партию - http://static.springsource.org/spring-batch/

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

Каркас очень хорошо спроектирован и очень прост в использовании.

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

Возможно, вы захотите рассмотреть процесс проектирования следующим образом:

  1. Создать кеш, способный хранить 200 объектов
  2. Вызов веб-службы для извлечения данных
  3. Создать экземпляр объекта, проверить и сохранить данные в полях объекта
  4. Добавить объект в кеш.
  5. Когда кеш заполнен, выполнить пакетную фиксацию объектов в кеше в базе данных
  6. Продолжить с шага 1

SpringBatch позволит вам выполнять пакетные коммиты, контролировать размер пакетных коммитов, выполнять обработку ошибок при чтении ввода - в вашем случае повторите запрос, выполните обработку ошибок при записи данных в базу данных.

Посмотрите на это.

...