【问题标题】:Spring Batch JdbcPagingItemReader seems not EXECUTING ALL THE ITEMSSpring Batch JdbcPagingItemReader 似乎没有执行所有项目
【发布时间】:2016-05-23 09:13:43
【问题描述】:

我正在开发一款从 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>

谢谢

【问题讨论】:

  • 不,他们改变了他们最终使用的阅读器的使用方式不同
  • 尝试将以下属性添加到您的数据源 bean ""
  • 如果 possibel 保持 pagesize 和 commit-interval 相同。如果没有任何效果,那么我会说使用 JdbcCursorItemReader 一个一个读取..

标签: java spring spring-batch


【解决方案1】:

原来缺少的应该是 scope="step":

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

【讨论】:

  • 查看我下面关于 java 配置的评论
【解决方案2】:

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

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

在 spring batch 中,根据您的配置,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】:

    添加@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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多