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

Мне нужно загрузить некоторые устаревшие данные в рабочую базу данных Oracle (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 Insert для данных, которые необходимо заполнить.Существует некоторая логика, связанная с обработкой данных, бизнес-правил и т. д., которые применяются с помощью сценария, и ожидается, что сгенерированные операторы SQL Insert будут выполняться в одном пакете и должны иметь возможность вводить все устаревшие данные.

при условии, что максимальное значение последовательности равняется 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. вернуть приложение в исходное состояние.

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

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

Спасибо!

1 Ответ

2 голосов
/ 10 августа 2011

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

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

> 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 сгенерируют неявную фиксацию, поэтому после выполнения любая промежуточная транзакция будет зафиксирована, и любая работа, выполненная после них, будет отдельной транзакцией.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...