ETL в оперативную базу данных оракула - используется приложением jsp/spring/hibernate

Мне нужно, чтобы некоторые устаревшие данные были загружены в оперативную базу данных оракула (11gR2). База данных используется приложением jsp/spring/hibernate (3.2.5.ga). Последовательность используется для генерации уникальных ключей для всех таблиц. определение последовательности приведено ниже:

CREATE SEQUENCE  "TEST"."HIBERNATE_SEQUENCE"  MINVALUE 1 MAXVALUE 999999999999999999999999999 INCREMENT BY 1 START WITH 1000 CACHE 20 NOORDER  NOCYCLE 

Идея загрузки данных/ETL состоит в том, чтобы придумать сценарий, который начинается с максимального значения последовательности, запустив

   select HIBERNATE_SEQUENCE.NEXTVAL from dual

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

предполагая, что максимальное значение последовательности равно 1000 - скрипт использует это как переменную и увеличивает по мере необходимости, а выходные SQL INSERTS будут такими, как показано ниже:

INSERT INTO USER_STATUS(ID, CREATE_DATE, UPDATE_DATE, STATUS_ID, USER_ID)
VALUES (**1001**, CURRENT_DATE, CURRENT_DATE, 20, 445);

INSERT INTO USER_ACTIVITY_LOG(ID, CREATE_DATE, UPDATE_DATE, DETAILS, LAST_USER_STATUS_ID)
VALUES (**1002**, CURRENT_DATE, CURRENT_DATE, 'USER ACTIVITY 1', **1001**);

INSERT INTO USER_STATUS(ID, CREATE_DATE, UPDATE_DATE, STATUS_ID, USER_ID)
VALUES (**1003**, CURRENT_DATE, CURRENT_DATE, 10, 445);

INSERT INTO USER_ACTIVITY_LOG(ID, CREATE_DATE, UPDATE_DATE, DETAILS,  LAST_USER_STATUS_ID)
VALUES (**1004**, CURRENT_DATE, CURRENT_DATE, 'USER ACTIVITY 3', **1003**);

Я создал некоторый фиктивный SQL, чтобы показать идею того, как будут выводиться INSERTS — в операциях вставки будет задействовано намного больше таблиц. всякий раз, когда нам нужно внести изменения в данные из серверной части, мы будем использовать HIBERNATE_SEQUENCE.NEXTVAL, чтобы получить следующее уникальное значение ключа. но поскольку сценарий генерации sql работает в автономном режиме, он не использует HIBERNATE_SEQUENCE.NEXTVAL, а вместо этого пытается увеличить локальную переменную.

Предположение, которое мы имеем о возможности сгенерировать (и запустить) этот скрипт, состоит в том, чтобы

  1. закрыть приложение на техническое обслуживание
  2. не имеют активности базы данных во время выполнения скрипта и начинают с максимального значения последовательности.
  3. сгенерировать SQL
  4. запустить SQL - зафиксировать.

  5. предполагая, что в процессе генерации скрипта максимальное значение последовательности увеличивается с 1000 до 5000 — после запуска скрипта и загрузки данных HIBERNATE_SEQUENCE необходимо удалить/создать, чтобы начать с 5001.

  6. верните приложение.

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

Любой вклад приветствуется.

Спасибо!


person user12002221    schedule 09.08.2011    source источник


Ответы (1)


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

Знаете ли вы в начале скрипта, сколько вставок вы будете делать? Если это так и предполагается, что у вас не будет никакой другой активности, вы можете настроить значение «инкремент на» для sequence , поэтому один выбор из него переместит последовательность вперед на любое значение, которое вы хотите.

> drop sequence seq_test;
sequence SEQ_TEST dropped.
> create sequence seq_test start with 1 increment by 1;
sequence SEQ_TEST created.
> select seq_test.nextval from dual;
NEXTVAL                
---------------------- 
1                      

> alter sequence seq_test increment by 500;
sequence SEQ_TEST altered.
> select seq_test.nextval from dual;
NEXTVAL                
---------------------- 
501                    

> alter sequence seq_test increment by 1;
sequence SEQ_TEST altered.
> select seq_test.nextval from dual;
NEXTVAL                
---------------------- 
502    

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

person Matthew Watson    schedule 10.08.2011
comment
Спасибо за эти предложения. Да, я буду знать количество вставок, участвующих в процессе, так как ключ увеличивается в скрипте. - person user12002221; 10.08.2011