2014-05-09 3 views
-1

우리 회사는 Microsoft Access 데이터베이스를 Cerner Multum에서 얻습니다.이 데이터베이스는 Sybase (12.0.1.3924) 인 프로덕션 백엔드와 다른 위치에 있어야합니다. 그리고 기성 데이터베이스 차용 도구 (http://www.diffkit.org/, http://www.liquibase.org/)를 알고있는 동안 아무 것도 내 필요에 맞지 않는 것 같습니다. 따라서 개념 증명으로 작업을 수행하는 Java 도구를 작성하기로 결정했습니다. 약자로멀티 스레드 데이터베이스 diffing에 대한 올바른 접근

,이 도구는 현재 여기에 설계된대로 작동하고이 절차의 : 모두 백엔드에 연결합니다

  1. 테이블의 목록을 얻 설정 파일
  2. 에서 diffed 할
    • 각 테이블의 경우 :
    • 은 diff를 진행, 설정 파일의 테이블 MS 액세스 및베이스
    • 그렇다면 모두에 대해 일치 할 수 있는지 확인 0,123,
      • 행의 각 열 위에 반사 통해
      • 반복 처리를 객체를 인스턴스화 MS 액세스에서 행을 구하여 액세스 POJO를 사용하여 새롭게 생성 된 "액세스"POJO
      • 으로 스터핑 데이터는베이스에 대한 쿼리를 구축
      • 쿼리베이스 :
      • 결과 세트가 NULL 인 경우, 결과가 NULL로 설정하면,
      • 베이스
      • 에 레코드를 삽입 그것으로 다른 POJO 물건 Sybase 데이터를 인스턴스화합니다.
      • 두 POJO를 비교하십시오 :
      • POJO가 일치하는 경우 : 아무 것도하지 말고 다음 행으로 이동하십시오.
      • POJO를 일치하지 않는 경우 : 매우에 불구하고, 액세스 POJO
    • 지금 언급 한 바와 같이

이 현재 작업이 이루어지고의 데이터를 사용하여베이스에 대한 업데이트를 수행 절차, 단일 스레드 방식, 그리고 내 질문 거짓말 : 멀티 스레드 방식으로 두 데이터베이스 (그 관련이없는 일이) diffing에 적절한 접근 방식은 무엇입니까?

나는 멀티 스레딩에 대한 경험이 있지만 삽입/업데이트를 대기 적이 없으므로 정확한 접근법에 대해 확실하지 않습니다. 즉, 나는 완전히 대기열에 적절한 접근 방식이 아니라고 말했어 - 일괄 업데이트/삽입은 어떨까?

이 영역에 대한 경험이있는 사람이라면이 문제에 접근하는 방법에 대한 높은 수준의 통찰력을 얻을 수 있습니까? 그것이 그대로, 약 2 시간 만에 1.5m 행을 휘젓고 있는데 대략 200 TPS입니다. 아주 느린. 모든 지침을 크게 높이겠습니다. 필요한 경우 추가 정보를 제공해 드리겠습니다.

+1

또한보십시오 http://stackoverflow.com/a/29502316/32453 – rogerdpack

답변

1

이런 종류의 작업을 올바르게 수행하는 도구를 사용하는 것이 내 경험상 매우 중요합니다. 속도가 느릴 수 있지만 속도가 빠르면 속도를 빠르게 변경하면 잘못된 결과가 발생할 위험이 없습니다.

각 테이블에 대한 현재의 diff-procedure는 멀티 스레딩에 적합합니다.업데이트해야 할 (Sybase) 데이터베이스와 통신 할 때 프로 시저가 네트워크 대기 시간에서 대부분의 시간을 낭비합니다. 두 개의 스레드를 병렬로 처리하면 처리량이 향상됩니다.

한 스레드가 입력 (MS 액세스) 데이터베이스의 테이블에서 레코드를 읽고 동시 큐에 액세스 Pojos를 넣으십시오 (예 : ConcurrentLinkedQueue). 많은 스레드가이 큐에서 Access Pojos를 읽고 업데이트 프로 시저를 병렬로 실행하게합니다.
테이블에 더 이상 레코드가 없으면 읽기 스레드가 특별한 "end of table"큐에 Pojos에 액세스하여 update-threads가 중지 할시기를 알리도록합니다. 또한 읽기 스레드는 큐가 너무 커지면 일시 중지해야합니다 (또는 ArrayBlockingQueue 사용).
다음 표에서 반복하십시오.

아이디어는 현재 소스 코드가 너무 많이 변경되지 않고 이동하기 때문에 (물건을 깨뜨릴 위험이 최소화 됨) 읽기 스레드가 MS Access 데이터베이스에서 읽기 용으로 현재 코드가있는 Runnable 개체를 가져 와서 Pojo에 액세스하고 (루프에서 수행) 쓰기 스레드는 Sybase 데이터베이스를 비교 및 ​​업데이트하기위한 현재 코드로 Runnable을 가져옵니다.

+0

이것은 많은 의미가 있습니다; ArrayBlockingQueue가 필요하지만 ConcurrentLinkedQueue를 구현 (또는 조사) 할 기회가 아직 없기 때문에 ThreadPoolExecutor에 선물을 제출하는 것에 익숙합니다. 나는 응답을 대단히 감사한다. 이 모든 시간 내 얼굴을 쳐다보고있는 것처럼 보입니다. – lux

+1

이제'Queue + Write thread = FixedThreadPool'라고 언급 했으므로 직접 할 필요가 없습니다. 읽기 스레드가 액세스 객체를 실행 파일로 감싸도록하고 필요한 것은 Executors.newFixedThreadPool (int)입니다. – vanOekel

관련 문제