복붙노트

[SPRING] Spring Batch JdbcPagingItemReader가 모든 항목을 실행하지 않는 것 같습니다.

SPRING

Spring Batch JdbcPagingItemReader가 모든 항목을 실행하지 않는 것 같습니다.

나는 오라클 데이터베이스에서 레코드를 추출한 다음 하나의 단일 테이블 파일로 내보내는 앱을 개발 중입니다.

그러나 JdbcPagingItemReader를 사용하여 DB에서 읽으려고 시도하고 파일에 쓰려고하면 pageSize에 지정된 레코드 수만 얻습니다. 따라서 pageSize가 10이면 10 줄의 파일이 생기고 나머지 레코드는 무시 된 것 같습니다. 지금까지, 나는 정말로 무슨 일이 일어나고 어떤 도움이 가장 환영 받을지를 알 수 없었다.

다음은 JdbcPagingItemReader 구성입니다.

<bean id="databaseItemReader"
class="org.springframework.batch.item.database.JdbcPagingItemReader" >
    <property name="dataSource" ref="dataSourceTest" />
<property name="queryProvider">
  <bean
    class="org.springframework.batch.item.database.support.SqlPagingQueryProviderFactoryBean">
    <property name="dataSource" ref="dataSourceTest" />
    <property name="selectClause" value="SELECT *" />
    <property name="fromClause" value="FROM *****" />
    <property name="whereClause" value="where snapshot_id=:name" />
    <property name="sortKey" value="snapshot_id" />
  </bean>
</property>
<property name="parameterValues">
   <map>
    <entry key="name" value="18596" />
   </map>
</property>
    <property name="pageSize" value="100000" />
<property name="rowMapper">
    <bean class="com.mkyong.ViewRowMapper" />
</property>

<bean id="itemWriter" class="org.springframework.batch.item.file.FlatFileItemWriter">
<!-- write to this csv file -->
<property name="resource" value="file:cvs/report.csv" />
<property name="shouldDeleteIfExists" value="true" />

<property name="lineAggregator">
      <bean
       class="org.springframework.batch.item.file.transform.DelimitedLineAggregator">
    <property name="delimiter" value=";" />
    <property name="fieldExtractor">
          <bean class="org.springframework.batch.item.file.transform.BeanWrapperFieldExtractor">
        <property name="names" value="ID" />
       </bean>
    </property>
       </bean>  
</property>

  <job id="testJob" xmlns="http://www.springframework.org/schema/batch">
<step id="step1">
  <tasklet>
    <chunk reader="databaseItemReader" writer="itemWriter" commit-interval="1" />
  </tasklet>
</step>

감사

해결법

  1. ==============================

    1.그것은 scope = "step"이었습니다.

    그것은 scope = "step"이었습니다.

    <bean id="databaseItemReader"
        class="org.springframework.batch.item.database.JdbcPagingItemReader" scope="step">
    
  2. ==============================

    2.페이지 크기가 정렬 열 이름과 함께 사용되므로 whereClause 및 정렬 키가 동일하지 않을 수 있습니다.

    페이지 크기가 정렬 열 이름과 함께 사용되므로 whereClause 및 정렬 키가 동일하지 않을 수 있습니다.

    귀하의 데이터 (해당 표에서)가 어떻게 보이는지 확인하십시오.

    Spring 배치에서, 설정에 따라, Spring은 아래와 같이 생성되고 실행될 것입니다. pagesize = 10으로 실행 된 첫 번째 쿼리는 다음과 같습니다.

    SELECT top 10  FROM tableName where snapshot_id=18596 snapshot_id > 10
    

    두 번째 / 나머지 쿼리는 정렬 키에 따라 달라집니다.

    SELECT *  FROM tableName  where snapshot_id=18596 snapshot_id > 10
    SELECT *  FROM tableName  where snapshot_id=18596 snapshot_id > 20
    

    데이터베이스에서이 쿼리를 실행 해보십시오. 이상하게 보이지 않습니다. :-)

    where 절이 필요하지 않으면 제거하십시오.

    그리고 가능하다면 페이지 크기와 커밋 간격을 동일하게 유지하십시오. 이것이 프로세스와 지속 방식을 결정하기 때문입니다. 물론 디자인에 따라 다릅니다. 그래서 당신이 결정합니다.

  3. ==============================

    3.@StepScope를 추가하면 항목 판독기가 페이징 기능으로 이륙했습니다.

    @StepScope를 추가하면 항목 판독기가 페이징 기능으로 이륙했습니다.

    @Bean
    @StepScope
    ItemReader<Account> ItemReader(@Value("#{jobParameters[id]}") String id) {
        JdbcPagingItemReader<Account> databaseReader = new JdbcPagingItemReader<>();
        databaseReader.setDataSource(dataSource);
        databaseReader.setPageSize(100);
        databaseReader.setFetchSize(100);
        PagingQueryProvider queryProvider = createQueryProvider(id);
        databaseReader.setQueryProvider(queryProvider);
        databaseReader.setRowMapper(new BeanPropertyRowMapper<>(Account.class));
        return databaseReader;
    }
    
  4. from https://stackoverflow.com/questions/35358905/spring-batch-jdbcpagingitemreader-seems-not-executing-all-the-items by cc-by-sa and MIT license