2011-08-09 57 views
0

我需要有裝入操作的Oracle(11gR2的)數據庫一些遺留的數據。數據庫正在被jsp/spring/hibernate(3.2.5.ga)應用程序使用。一個序列用於在所有表中生成唯一鍵。序列定義如下:ETL到操作Oracle數據庫 - 由JSP /彈簧使用/休眠應用

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

的理念,爲數據加載/ ETL是拿出wtih,通過在開始時運行

select HIBERNATE_SEQUENCE.NEXTVAL from dual 

與最大序列值開始的腳本腳本生成過程 - 併爲需要填充的數據生成SQL Insert語句。在處理數據清理,業務規則等方面涉及到通過腳本應用應用程序的一些邏輯,生成的SQL插入語句預計將在一批中運行,並且應該能夠引入所有遺留數據。

假設最大序列值是1000 - 腳本使用這個作爲的變量,增量是必要的,輸出SQL插入將是如下:

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. 把應用備份。

現在,由於我發佈這個,在這樣的細節...我需要你的建議/輸入有關這個設計的任何漏洞,如果有什麼我俯瞰。

任何輸入表示讚賞。

謝謝!

回答

2

我會建議反對刪除和創建如果您的應用程序用於任何其他任務的順序,這樣做意味着你還需要重新添加任何權限,同義詞等。

你知道在腳本,你有多少做插入的開始?如果是這樣,並且假設您不會有任何其他活動,那麼您可以調整序列的「增加量」值,因此只需從中選擇一個值即可將序列向前移動任意值。

> 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語句會發出一個隱含的承諾,所以一旦他們已經運行的任何正在進行的事務將被COMMITED,並在他們之後進行的任何工作將是一個單獨的事務。

+0

謝謝你的建議。是的,我會知道過程中涉及的插入數量,因爲密鑰在腳本中增加。 – user12002221