오늘은 Spring Batch Partition에 대해 말해보려고 합니다...
 
 
Spring Batch는 "chunk" 기반으로 처리를 합니다...
 
 
이는 우선 row들을 하나씩 읽어서 출력을 위한 chunks들을 생성합니다...
 
 
ItemReader가 read 역할을 담당하고,
 
 
ItemProcessor가 처리하고 모읍니다...
 
 
아이템의 수가 commit interval에 도달하면 전체 chunk는 ItemWriter에 전달되어 commit됩니다...
 
 
일반적으로는 이런데 Spring Batch는 시리얼한 작업을 페러렐하게 수행할 수 있도록 
 
 
파티셔너라는 기능을 제공합니다...
 
 
파티션 이름은 임의로 줘도 되나 unique해야 합니다...
 
 
<batch:handler grid-size="5" task-executor="taskExecutor" /> 에서
 
 
grid-size는 필수 파라메터이며 slave의 수입니다...
 
 
파티션된 수가 grid-size와 같을 필요는 없습니다... 적거나 많아도 되지요...
 
 
총 데이터 사이즈가 200이고 grid-size가 4라고 하면 각 스레드는 다음과 같은 데이터를 처리합니다...
 
 
1번 스레드 : 0 ~ 50
2번 스레드 : 50 ~ 100
3번 스레드 : 100 ~ 150
4번 스레드 : 150 ~ 200
 
 
이제 대량 배치에 대한 구성상의 포인트를 말해보려고 합니다...
 
 
1) 먼저 초기화가 빨리 되야 합니다... 즉, Job 단위별로 Spring Batch Job XML 파일을 구성하고 초기화합니다...
 
 
2) MyBatisCursorItemReader를 사용하여 대용량 데이터도 메모리 문제 없이 잘 처리해야 합니다...
 
 
3) MyBatis의 SqlSessionTemplate에서 batch 설정을 해야 합니다..
 
 
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate" destroy-method="clearCache">
        <constructor-arg index="0" ref="sqlSessionFactory" />
        <constructor-arg index="1" value="BATCH" />
</bean>
 
 
4) 위에서 말한 Partition 기능을 잘 사용해야 합니다... 병렬 처리를 잘 해야된다는 뜻이지요...