2016-10-11 1 views
1

저장 한 레코드에 일괄 처리를 포함하는 최대 절전 모드 응용 프로그램을 작성 중입니다.처리 완료 후 다른 데이터베이스 작업에 동일한 스레드 사용

데이터베이스 테이블에 30000 개의 레코드가 저장되어 있고 30 개의 스레드가 있다고 가정합니다. 각 스레드는 병렬로, 즉 일괄 처리로 1000 개의 레코드를 처리합니다. Thread1 processes 1000 to Thread2 : 1001 to 2001, etc. 여기서 process는 내가 모두 일괄 적으로 select 연산을 수행한다는 것을 의미합니다. 나는 이들을 파싱하여 웹 서비스로 보내기 위해이 레코드를 처리하고있다.

시나리오가이 문제가 여기 때 발생하는 레코드가 다음 레코드의 상태 열에 다른 하나 이제 0

로 만들어지는 웹 서비스에 의해 허용되는 경우 데이터베이스 테이블의 상태라는 이름의 열입니다 Thread1은 id가 1에서 1000 사이의 레코드를 처리하고 Thread 2는 여전히 1001에서 2001을 처리합니다. id가 5에서 30, 40에서 50 사이 인 레코드가 0, 즉 웹 서비스에 전달되지 않은 것으로 가정합니다. 이제 시나리오는 처리가 완료된 스레드, 즉 Thread1이 ID가 5 ~ 30, 40 ~ 50 인 레코드를 처리하고 레코드의 메시지를 웹 서비스로 다시 전달하려고 시도해야합니다.

나는 위와 같은 방법으로 코딩하기 위해 ExecutorService을 사용하고 있습니다.

+1

은 너무 커서 선택하기 위해 30 개의 스레드를 사용해야합니다. 1 개의 스레드 선택기와 30 개의 작업자 스레드를 사용하는 것은 어떻습니까? – JIV

+0

몇 개의 코어를 사용할 수 있습니까? 30보다 작 으면 과도한 컨텍스트 스위칭과 스 래싱으로 인해 병렬화가 이루어지지 않습니다. 지나치게 복잡한 디자인처럼 들립니다. – duffymo

+0

아니요. 이미 처리하는 데 많은 시간이 걸리고 레코드의 일괄 처리 및 배달에 대한 언급을 잊어 버렸기 때문에 단일 스레드로 알고있는 30000 레코드 이상을 처리하는 것이 좋습니다. webservice는 ** 15 분 **의 제한된 시간 프레임 내에서 발생해야합니다. 내 컴퓨터에는 8 개의 코어가 있습니다. –

답변

1

처리해야하는 레코드로 채워진 공유 차단 대기열을 사용할 수 있습니다. 즉, ExecutorService 스레드 외부의 30000 레코드를 선택한다는 의미입니다.

그런 다음 Thread 코드에서 각 스레드는 대기열에서 상위 1000 개 (using this method) 개의 레코드를 가져 와서 처리합니다. 중요한 부분은 다음과 같습니다. 웹 서비스에서 거부 된 레코드가 대기열에 다시 저장되므로 다른 실행 스레드가 사용 가능할 때 전달되지 않은 메일을 선택합니다.

레코드에 배달 카운터를 추가하고 메시지가 제한된 횟수만큼 재전송되는지 확인해야합니다 (일부 변형 된 경우 영원히 재전송되지 않습니다).