ETL转换为可操作的oracle数据库-由jsp/spring/hibernate应用程序使用



我需要将一些遗留数据加载到操作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 insert将如下所示:

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来展示insert输出的想法——插入操作将涉及更多的表。每当我们需要从后端进行数据更改时,我们将使用HIBERNATE_SEQUENCE。NEXTVAL获取下一个唯一键值。但是由于sql生成脚本在断开连接模式下运行,所以它不使用HIBERNATE_SEQUENCE。

我们假设能够生成(并运行)这个脚本是

  1. 将应用程序撤下进行维护
  2. 在运行脚本期间没有数据库活动,并以最大序列值开始。
  3. 生成SQL
  4. 执行SQL - commit。

  5. 假设,在脚本生成过程中,最大序列值从1000上升到5000 -在脚本运行并加载数据后,需要删除/创建HIBERNATE_SEQUENCE以从5001开始

现在,对于我发表这篇文章的原因,如此详细…我需要你的建议/输入关于这个设计的任何漏洞,如果有什么我忽略了。

欢迎任何输入。

谢谢!

如果序列用于应用程序中的任何其他任务,我建议不要删除和创建序列,这样做意味着您还需要重新添加任何权限,同义词等。

你知道在脚本开始的时候你要插入多少次吗?如果是这样,并且假设您没有任何其他活动,那么您可以调整序列的"增量"值,因此单个选择将使序列向前移动任何您想要的值。

> 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语句将发出隐式提交,因此一旦它们运行,任何飞行事务都将被提交,而在它们之后执行的任何工作都将是一个单独的事务。

最新更新