2010-12-08 6 views
2

Java 코드를 개발하려고합니다. SQL 데이터베이스에서 JDBC 드라이버가 가져온 많은 양의 데이터를 처리 한 다음 DB에 다시 저장합니다.하나의 리더 스레드, 하나의 작성자 스레드, n 개의 작업자 스레드

리더 스레드, 작성자 스레드 및 사용자 정의 가능한 작업자 스레드 수를 포함하는 관리자를 만드는 방법을 생각했습니다. 판독기 스레드는 데이터를 DTO로 읽어서 Queue에 전달하여 '처리 준비 완료'상태로 만듭니다. 작업자 스레드는 DTO를 처리하고 처리 된 객체를 다른 대기열 labeld 'persistence ready'에 놓습니다. writer 쓰레드는 데이터를 DB에 저장한다. 그런 접근 방식이 최적입니까? 아니면 데이터를 가져 오는 데 더 많은 독자를 허용해야합니까? 내가 알지 못하는 이런 종류의 일을하기 위해 Java에 준비된 라이브러리가 있습니까?

답변

3

제안 된 접근 방식이 최적인지 여부는 결정적으로 DB에서 얻는 비용과 관련하여 데이터를 처리하고 DB에 결과를 다시 쓰는 것이 얼마나 비싼지에 달려 있습니다. 처리가 상대적으로 비싸면이 방법이 효과적 일 수 있습니다. 그렇지 않은 경우 약간의 이점을 위해 상당한 양의 복잡성을 도입 할 수 있습니다 (전체 처리량에 중요한 영향을 줄 수도 있고 그렇지 않을 수도있는 파이프 라인 병렬 처리가 여전히 있습니다).

벤치마킹 만하는 유일한 방법은 별도로 3 단계를 거쳐 최적의 디자인을 선택하십시오.

다중 스레드 접근 방식이 제공되는 경우 두 대기열을 사용하는 디자인이 합리적으로 들립니다. 고려해야 할 추가 사항 중 하나는 각 큐의 크기에 제한이 있다는 것입니다.

1

명시 적 대기열을 사용하는 대신 ExecutorService를 사용하여 작업을 추가 할 수 있습니다. 이렇게하면 Java 관리자가 스레드 풀을 사용할 수 있습니다.

1

Spring Batch가 제공하는 기능과 비슷한 것을 작성하는 것에 대해 설명하고 있습니다. 내가 너라면 그걸 알아볼거야. 나는 당신이 그것을 사용하는 것을 묘사하고있는 것과 유사한 작업을 행운을 비 겼다. 병렬 및 다중 스레드 처리, 여러 데이터베이스 판독기/작성기 및 기타 여러 가지 기능이 제공됩니다.

2

나는 내 과거의 반향을 듣고 내 실수를 되풀이하려는 경우를 대비해 다른 접근 방식을 제안하고 싶습니다. 귀하의 상황에 해당되거나 그렇지 않을 수도 있습니다.

데이터베이스에서 많은 양의 데이터를 가져와 데이터베이스로 다시 가져와야한다고 썼습니다.

작업해야하는 외부 데이터를 데이터베이스에 임시로 삽입하고 데이터베이스 내의 모든 처리를 수행 할 수 있습니까? 이것은 다음과 같은 장점을 제공합니다 :

  1. 그것은 그것은 (절차 능가하는 성능)
  2. 그것은 설정을 기반으로 가능
  3. 처리 많은 양의 데이터를 지속 할 필요가 없습니다
  4. 많은 양의 데이터를 추출 할 필요가 없습니다
  5. 데이터베이스가이를 지원하면 병렬 실행을 사용할 수 있습니다.
  6. 프로세스 중에 발생하는 모든 오류에 대한 보고서를 작성할 수있는 프레임 워크 (테이블 및 SQL)를 제공합니다.

예를 들어 설명해주십시오. 오래 전에 저는 구매, 지불 및 관련 고객 데이터를 파일에서 중앙 데이터베이스로로드하는 목적을 가진 (java) 프로그램을 구현했습니다.그 당시에는 (그리고 깊이 생각해 보았습니다.) 트랜잭션을 하나씩 처리하기 위해로드를 설계하고 각 데이터에 대해 여러 데이터베이스 조회 (SQL)를 수행하고 마지막으로 적절한 테이블에 여러 개의 삽입을 수행했습니다. 당연히 이것은 볼륨이 증가하면 확장되지 않았습니다.

그런 다음 나는 또 다른 실수를했습니다. 그게 문제였던 데이터베이스라고 생각했는데 (은 SELECT가 느리다는 의미로라고 들었습니다.) 그래서 나는 데이터베이스에서 모든 데이터를 꺼내 자바에서 모든 처리를하기로 결정했습니다. 마지막으로 모든 데이터를 데이터베이스에 다시 저장합니다. 로드 프로세스를 쉽게 확장 할 수 있도록 모든 종류의 레이어를 콜백 메커니즘으로 구현했지만 성능이 좋지 않았습니다.

리어 미러를 보면, 내가해야 할 일은 테이블에 일시적으로 10 만 줄을 삽입하고 거기에서 처리하는 것입니다. 제가 처분 할 수있는 모든 기술의 힘을 발휘한다면 거의 반나절 정도의 과정을 거쳐야 몇 분이 걸렸을 것입니다.

1

스프링 배치를 사용하십시오! 그것이 바로 당신이 필요로하는 것입니다.