簡體   English   中英

Spring Batch JdbcPagingItemReader似乎沒有執行所有項目

[英]Spring Batch JdbcPagingItemReader seems not EXECUTING ALL THE ITEMS

我正在開發一個從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>

謝謝

缺少的是scope =“ step”,應該為:

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

您的設置似乎不正確,因為whereClause和sort鍵不能相同,因為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子句,請將其刪除。

並盡可能保持頁面大小和commit-interval相同,因為這是您決定處理和持久化的方式。 但是,當然這取決於您的設計。 所以你決定。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM