2014-02-10 8 views
0

고유 일련 번호를 가져 와서 db2 테이블 중 하나에 해당 번호를 삽입하기 위해 java를 통해 db2 저장 프로 시저를 호출하는 bpel 프로세스가 있습니다. 이 프로세스는 클러스터 환경에서 실행되기 때문에 프로세스의 두 인스턴스가 동일한 순차 번호를 가져 와서 중복 값을 테이블에 삽입하여 오류가 발생하는 경우가 있습니다. 감사.클러스터 환경에서 bpel 서비스의 중복 문제

+0

이며, 저장 프로 시저 독특한 시퀸을 만들어 내야한다. ce 번호는 그렇지 않습니다. 해당 프로 시저를 재 작성해야하거나 가능하지 않은 경우 두 프로그램이 동시에 프로 시저를 호출 할 수 없도록 Java 프로그램에서 호출을 동기화 할 수 있습니다. – mustaccio

+0

또 다른 옵션은 내장 된 ['sequence'] (http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.admin.dbobj.doc/)를 사용하는 것입니다. doc/c0023175.html)이 중복되지 않도록 보장 된 DB2에 입력하십시오. – bhamby

+0

정보를 제공해 주셔서 감사합니다. 스토어드 프로시 저는 DB2에서 순서 유형을 사용 중입니다. 또한 클러스터 환경으로 인해 자바를 통한 호출 동기화는 코드가있는 서버 2 개와 db2 시퀀스에 대한 Java 호출이 동시에 발생하여 두 개에서 동시에 생성되므로 해결되지 않습니다. – Sonali

답변

0

@mustaccio에 따르면 시퀀스를 사용하는 경우 시퀀스에서 동시에 값을 요청하는 클라이언트 수에 관계없이 동일한 값을 두 번 가져올 수 없습니다.

즉, 시퀀스가 ​​아직 생성하지 않은 값을 가진 테이블에 행을 삽입 할 수없는 것은 없습니다. 순서가 문제의 값을 반환하고 당신이 그것을 삽입하려고 할 때 다음, 그것은 실패합니다 프로세스가 값을 삽입하지 않는 것이 확인

  1. :

    create table test (id int not null primary key); 
    create sequence s1 start with 10; 
    
    -- This will insert the value 10, which is OK. 
    insert into test values (nextval for s1); 
    
    -- This will insert the value 11, which is OK. 
    insert into test values (nextval for s1); 
    
    -- Insert a row without using sequence (BAD!) 
    insert into test values (13); 
    
    -- This will insert the value 12, which is OK. 
    insert into test values (nextval for s1); 
    
    -- This will attempt to the value 13, which will fail because it is a "duplicate", 
    -- but not because the sequence generated a duplicate. 
    insert into test values (nextval for s1); 
    

    이 문제에 대한 해결책은 것입니다 시퀀스를 사용하지 않고

  2. # 1을 사용할 수 없으면 alter sequence을 사용하여 충돌을 일으키지 않도록 시퀀스를 다시 시작해야합니다. alter sequence s1 restart with 14 장난 꾸러기 삽입 문을 수행 한 후.
0

당신이 말한대로 (위의 예제에서 BPEL은 BPEL 폴링을 사용하는 경우

, 당신이 표시된 있는지 확인하십시오 .. 클러스터 environmnent에서 실행 '분산 폴링'플래그. 분명히

분산 폴링 레코드를 읽을 때, 그것이 읽는 인스턴스에 의해 잠겨 있음을 의미합니다. 잠겨 기록 레코드 건너 뛰고 픽업을 원하는 또 다른 인스턴스를.