2017-12-08 3 views
0

저는 Spring, Java, Ibatis, Oracle을 사용합니다. 많은 데이터를 처리하기 위해 멀티 스레딩을 사용하는 1 개의 작업이 있습니다.다중 스레드 : 중복 된 데이터를 쓸 때 가장 좋은 방법

모든 스레드는 데이터베이스 내의 같은 테이블에 데이터를 작성하지만, 약간의 시간이 스레드의 데이터는 그와 같은 contraint에 의해 동일합니다

CONSTRAINT n_uc1 UNIQUE (name, title, language, ...) 

합니다. 같은 예제 코드 :이 코드

public Long write(Input input) { 
     Long key = read(input); 
     if (key != null) 
     { 
      return key; 
     } 

     try 
     { 
      key = write(input); 
     } 
     catch (org.springframework.dao.DuplicateKeyException ex) 
     { 
      // if exception happend, it means already wrote data, read it again 
      key = read(input); 
     } 
     return key; 
    } 

, 나는 내가 기대하는 얻을 수 있지만, 시간이 나는 예외를 가지고, 그것은 성능이 아래로 이동합니다.

규칙은 다음과 같습니다는 성능이

당신이 어떤이 있습니까 내려 갈 수 있기 때문에

  • 내가, 내가 원하지 않는
  • 동기화 사용하는 스키마를 업데이트 할 수 없습니다 이것에 대한 다른 해결책? 성능이 매우 중요합니다.

+0

모습이주는 : HTTPS : //dba.stackexchange.com/questions/72501/duplicate-key-violates-unique-constraint-when를 -using-multi-threading –

+0

Thanks @AmolRaje,하지만 스키마를 업데이트 할 수 없습니다. 즉, 저장 프로 시저를 만들 수 없습니다. 다른 생각? – BIZ

+1

* "성능은 매우 중요합니다"* 그러나 데이터베이스 성능을 관리하는 가장 중요한 요소를 변경할 수는 없습니까? 슬퍼. – APC

답변

1

설명은 매우 모호하지만 여전히 답을 찾으려합니다.

제약 조건 동기화 또는 제거가 옵션이 아닌 경우 데이터를 스레드로 보내는 방법을 고려할 수 있습니다.

내가 이해 한 설명에서 때로는 하나 이상의 스레드가 처리를 위해 동일한 데이터를 선택합니다.

그런 경우 스레드가 입력 데이터를 무작위로 선택하는 것보다 스레드간에 입력 데이터를 배포하는 논리가 생길 수 있습니다.

당신이 입력 데이터에 대한 정보를 제공 할 수있는 경우, 쉬운 해결책을