2014-12-12 3 views
1

저는 일괄 처리 작업을 통해 데이터베이스에서 데이터 행을 얻습니다.스프링 배치 rowNum이 증가하지 않습니다.

RowMapper의 첫 번째 행에서 무엇인가하고 싶습니다.

public myVO mapRow(ResultSet rs, int rowNum) throws SQLException { 
    System.out.println("rowNum is " + rowNum); 
    if (rowNum == 1) { 
     // do something 
    } 
    // some other code here 
} 

이것은 처음에는 잘 작동합니다. 그러나 scope="step"을 리더 파트의 일괄 xml 파일에 추가 한 후에 rowNum은 항상 0으로 시작하여 증가합니다.

scope="step"을 유지하는 동안 문제를 해결할 수있는 방법이 있습니다.

+0

문제가 단계 범위로 인해 발생했다고 생각하지 않습니다. 문제를 재현하여 여기에 게시 할 수있는 최소한의 일자리를 만들 수 있습니까? –

+0

'late-binding'' scope = "step"'을 제거하려고 시도하고'rowNum'이 다시 작동합니다. 그런 다음 다시 넣으면'rowNum'이'System.out.println();에 0으로 표시됩니다. –

+0

여기에 SQL 쿼리를 넣을 수 있습니까? 이 시나리오에서 값이 변경되는 where 절이 있습니까? – kamoor

답변

2

Scope = "step"의 의미는 각 실행 단계마다 인스턴스를 작성한다는 것입니다. 즉, 각 스레드에 대해 새 인스턴스를 갖게됩니다.

"step"범위를 정의하면 프로세서 행의 새로운 인스턴스가 맵 행을 호출하고 시작 값이 0이됩니다. 올바르게 작동한다고 말하면 추가로 표시됩니다 단계 범위를 제거 할 때

그래서 할 수있는 일은 정적 원자 정수 (스레드 안전)를 유지하고 rowNumber를 사용하는 대신 논리에 해당 카운터에 의존하는 것입니다.

이것이 이해가되지 않는다면 추가 분석을 위해 구성을 공유하십시오. 감사.

+0

Oa, 왜 나는 결코 정적에 대해 생각하지 않습니다. 나는 정상적인 정수를 선언하고 계속 작동하지 않는다. –

+0

스레드 안전성에 항상 관심이 있습니다. 정적 변수는 스레드 안전이 아니므로 동기화를 찾거나 AtomicInteger와 같은 원자 변수를 사용하십시오. –

1

당신이 scope="step"을 유지하고 싶은 RowMapperrowNum 속성을 사용하지만 myVO 객체가 ItemCountAware 및 대리인이 현재 항목의 수를 설정 할 책임이 SB을 구현하지 않는 계산을 행합니다.

관련 문제