2016-02-12 374 views
1

我工作的一個應用程序,提取從Oracle數據庫中的記錄,然後導出爲一個單獨的表格文件。Spring Batch的JdbcPagingItemReader似乎沒有執行所有的項目

然而,當我嘗試使用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> 

感謝

+0

http://stackoverflow.com/questions/33345157/spring-batch-jdbcpagingitemreader-seems-not-paginating?rq=1 –

+0

可能的重複不,它們不一樣,他們改變了他們最終使用的讀者的使用jdbcCursorItemReader在我的情況,我想絕對使用JdbcPagingItemReader性能方面的原因 – user3580733

+0

嘗試添加以下屬性到你的數據源豆「的」 – surya

回答

0

它是範圍= 「步驟」 的是WA失蹤的應該是:

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

你設置似乎不正確的whereClause和排序鍵不能爲同一因爲頁面大小的手的作品與您的排序列名手。

檢查如何是你的數據(對應表)看起來像。

在彈簧批次,按您的配置,彈簧將創建和執行如下面給出的。與頁大小= 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子句,將其刪除。

如果可能保持頁面大小和提交間隔相同,因爲這是你決定如何處理和堅持。但當然這取決於你的設計。所以你決定。