2011-11-21 1 views
4

Oracle 10gR2에서 작업하고 있습니다.Oracle 프로 시저에서 멀티 스레딩 구현

그리고 여기 내 문제입니다 - 내가 절차를

, 호출 할 수 있습니다 * proc_parent *, 다른 프로 시저를 호출하도록되어있는 (패키지 내부가) 그것을 * user_creation *를 호출 할 수 있습니다. * user_creation *을 루프에서 호출해야합니다.이 루프는 테이블에서 일부 열을 읽으며이 열 값은 * user_creation * 절차에 매개 변수로 전달됩니다.

코드는 다음과 같다 :

FOR i IN (SELECT community_id, 
         password, 
         username 
       FROM  customer 
       WHERE community_id IS NOT NULL 
       AND  created_by = 'SRC_GLOB' 
      ) 
    LOOP 
     user_creation (i.community_id,i.password,i.username); 
    END LOOP; 

COMMIT; 

user_Creation 절차는 어떤 비즈니스 로직에 대한 웹 서비스를 호출하고 응답이 테이블을 업데이트에 다음을 기반으로합니다.

여기서는 멀티 스레딩을 사용할 수있는 방법을 찾아야하므로이 절차의 여러 인스턴스를 실행하여 작업 속도를 높일 수 있습니다. * DBMS_SCHEDULER * 및 아마도 * DBMS_ALERT *을 사용할 수 있지만 루프 내에서 사용하는 방법을 알 수는 없습니다.

나를 올바른 방향으로 인도 할 수 있습니까?

덕분에, Ankur

답변

1

이 질문을 닫습니다. DBMS_SCHEDULER와 DBMS_JOB (비록 DBMS_SCHEDULER가 선호 됨)은 루프 내에서 작업을 제출하고 실행하기 위해 사용될 수 있습니다. 병렬 작업 (따라서 절차를) 킥오프 것를 제출 한 후 커밋 사용

... 
FOR i IN (SELECT community_id, 
       password, 
       username 
      FROM customer 
      WHERE community_id IS NOT NULL 
      AND created_by = 'SRC_GLOB' 
     ) 
LOOP 
DBMS_JOB.SUBMIT(JOB => jobnum, 
       WHAT => 'BEGIN user_creation (i.community_id,i.password,i.username); END;'  
COMMIT; 
END LOOP; 

:

는 예를 들어, 여기에 루프 내에서 호출 할 수 DBMS_JOB을 사용하여 샘플 코드입니다.

3

은 당신이 할 수있는 일은 같은 시간에 많은 일자리를 제출합니다. Example 28-2 Creating a Set of Lightweight Jobs in a Single Transaction

이렇게하면 pl/sql 테이블을 한 번에 하나의 tx로 제출하려는 모든 작업으로 채 웁니다. 제출 (사용 가능)되면 시스템이 처리 할 수있는만큼 또는 자원 관리자 계획에서 허용하는만큼 실행을 시작합니다.

Lightweight 작업의 오버 헤드는 매우 작습니다.