Spring Batch JdbcPagingItemReader似乎没有执行所有项目

时间:2016-02-12 09:23:45

标签: java spring spring-batch

我正在开发一个从Oracle数据库中提取记录然后导出为单个列表文件的应用程序。

但是,当我尝试使用JdbcPagingItemReader从数据库读取并写入文件时,我只获取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>

 谢谢

3 个答案:

答案 0 :(得分:1)

这是范围=&#34;步骤&#34;错过了它应该是:

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

答案 1 :(得分:0)

whereClause和sort键不能相同,您的设置似乎不正确,因为pagesize与您的排序列名称密切配合。

检查您的数据(在相应的表格中)的样子。

在春季批次中,根据您的配置,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子句,请将其删除。

如果可能的话,保持页面大小和提交间隔相同,因为这是您决定处理和保持的方式。但当然这取决于你的设计。所以你决定。

答案 2 :(得分:0)

添加@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;
}
相关问题