이번에 오라클로 인터페이스 작업을 하게 됬다. Job으로 프로시져를 실행시키는 작업을 해야 할 것 같아서 테스트를 진행해 봤다.

win 7 x86 + 오라클 10g + 토드 9.0.1 으로 작업했다.
하단 스크립트들은 모두 토드의 마법사로 만든 것이다. 엑셀에 정리한 내용을 옮겨왔더니 무지막지하게 보기 싫어져 버렸다.

테스트 시나리오
테스트를 진행하기 전 가상의 시나리오를 생성한다.

1. 테이블을 생성한다.
테이블명은 test_schedule
필드구성은 일련번호, 비고, 입력일시로 간단하게 구성
일련번호는 시퀀스이고 시퀀스명은 SQ_TEST_SCHEDULE 임
sql 스크립트를 백업한다.

2. 프로시져 생성
프로시져명은 sp_test_schedule_ins
test_schedule 테이블에 insert 하는 프로시져
비고는 고정 텍스트
입력일시에는 입력 당시의 일시(sysdate)
프로시져를 실행하여 데이터 처리가 정상인지 확인한다.

3. 오라클 스케줄러 잡을 구성한다.
1분 6회만 실행되도록 처리한다.
10초에 한번씩 sp_test_schedule_ins 를 호출한다.

4. 결과를 확인한다.

시퀀스 스크립트

CREATE SEQUENCE LIMS_YS.SQ_TEST_SCHEDULE
START WITH 1
INCREMENT BY 1
MINVALUE 1
NOCACHE
NOCYCLE
NOORDER

테이블 스크립트

CREATE TABLE LIMS_YS.test_schedule
(
seq NUMBER,
memo VARCHAR2(10) DEFAULT '입력',
ins_date DATE DEFAULT sysdate
)

LOGGING
NOCOMPRESS
NOCACHE
NOPARALLEL
NOMONITORING;

COMMENT ON COLUMN LIMS_YS.test_schedule.seq IS '일련번호';
COMMENT ON COLUMN LIMS_YS.test_schedule.memo IS '비고';
COMMENT ON COLUMN LIMS_YS.test_schedule.ins_date IS '입력일시';


ALTER TABLE LIMS_YS.test_schedule ADD (
CONSTRAINT test_schedule_PK
PRIMARY KEY
(seq));

프로시져 스크립트

CREATE OR REPLACE PROCEDURE sp_test_schedule_ins IS

/******************************************************************************
NAME: sp_test_schedule_ins
PURPOSE: 오라클 job 테스트용, test_schedule 테이블에 데이터 insert

REVISIONS:
Ver Date Author Description
--------- ---------- --------------- ------------------------------------
Created this procedure.

NOTES:

Automatically available Auto Replace Keywords:
Object Name: sp_test_schedule_ins
Sysdate:
Date and Time:
Username:
Table Name: test_schedule

******************************************************************************/
BEGIN
insert into test_schedule values(sq_test_schedule.nextVal, '비고', sysdate);
-- EXCEPTION
-- WHEN NO_DATA_FOUND THEN
-- NULL;
-- WHEN OTHERS THEN
-- Consider logging the error and then re-raise
-- RAISE;
END sp_test_schedule_ins;

Job 스크립트

DECLARE
X NUMBER;
BEGIN
SYS.DBMS_JOB.SUBMIT
( job => X
,what => 'LIMS_YS.SP_TEST_SCHEDULE_INS;'
,next_date => to_date('01-01-4000 00:00:00','dd/mm/yyyy hh24:mi:ss')
,interval => 'TRUNC(SYSDATE)+1/8640'
,no_parse => TRUE
);
SYS.DBMS_JOB.BROKEN
(job => X,
broken => TRUE);
SYS.DBMS_OUTPUT.PUT_LINE('Job Number is: ' || to_char(x));
END;
/

commit;

테스트 결과

테스트 결과서        
           
테스트 진행을 위한 스크립트를 모두 생성한 후 진행된 테스트 결과를 기술한다.
           
1. Job 실행결과        
  select * from test_schedule where rownum <= 10    
  order by seq desc      
           
  결과        
  SEQ MEMO INS_DATE    
  67 비고 2011-04-13 오전 11:42:05    
  66 비고 2011-04-13 오전 11:41:55    
  65 비고 2011-04-13 오전 11:41:45    
  64 비고 2011-04-13 오전 11:41:35    
  63 비고 2011-04-13 오전 11:41:25    
  62 비고 2011-04-13 오전 11:41:15    
  61 비고 2011-04-13 오전 11:41:05    
  60 비고 2011-04-13 오전 11:40:55    
  59 비고 2011-04-13 오전 11:40:45    
  58 비고 2011-04-13 오전 11:40:35    
           
2. 결과          
  Job을 실행하면 10초에 한번씩 데이터가 insert 되는 것을 확인함  

문제점 및 해결방안


문제점

1. 오라클의 Job 패키지는 원하는 시간에 정확히 실행이 되지 않는다.
몇 초정도 뒤로 밀려서 실행이 되는 경우가 많은데 짧은 주기로 수행을
해야하는 조건에서는 문제가 될 수 있다.
수행 주기가 10초 단위가 지속적으로 유지되지 못하고 10~14초 사이를
왔다갔다 하는 현상이 발생할 수 있다.
예) 12:00:00 에 실행되야 하는 Job이 실제로는 12:00:04 에 실행된다.

2. Job 수행이 16번 실패하면 Broken 상태가 되어 관리자가 명시적으로
Run 명령을 수행해야 관련 Job이 다시 수행된다.

3. 수행해야 할 업무가 많을 경우(많은 인터페이스 작업과 같은) 아주 많은
Job을 만들어내야 하기 때문에 관리의 어려움이 있을 수 있다.


해결방법

1. 수행 주기가 민감하지 않다면 큰 문제는 아님
최소 단위를 분으로 하고 Trunc() 함수를 사용하여 분단위를 잘 맞추면
정확한 시간에 실행이 된다고 함

2. Broken 상태를 체크하여 Run 시켜주는 작업을 할 수 있음
관련 문서를 찾아 그에 맞게 작업해야 함

3. Job 관리 문서를 작성
Job을 오라클의 스케줄러로 관리하여 스케줄러만 관리하면 되도록 구성



출처 : http://findfun.tistory.com/entry/오라클-Job을-테스트하자

+ Recent posts