2014-02-05 86 views
0

我在Spring批處理作業中使用了分頁Jdbc閱讀器。我有一個表16行,我期待看到所有的行,但下面的配置僅返回10Spring批處理JdbcPagingItemReader - 當定義pageSize/fetchSize時不支持sortKey

<bean id="pagingQuery" class="org.springframework.batch.item.database.support.SqlPagingQueryProviderFactoryBean"> 
    <property name="dataSource" ref="myDataSource"/> 
    <property name="selectClause" value="select policy_number,val_date,name,sequence,amount,rate,frequency,start_date,end_date,basis"/> 
    <property name="fromClause" value="from MyTable"/> 
    <property name="sortKey" value="policy_number"/> 
    <property name="whereClause" value="load_id=:jobid"/> 
</bean> 
<bean id="tableReader" 
    class="org.springframework.batch.item.database.JdbcPagingItemReader" 
    scope="step"> 
    <property name="dataSource" ref="myDataSource"/> 
    <property name="queryProvider" ref="pagingQuery"/> 
    <property name="parameterValues"> 
     <map> 
      <entry key="jobid" value="1"/> 
     </map> 
    </property> 
    <property name="pageSize" value="10"/> 
    <property name="fetchSize" value="10"/> 
    <property name="rowMapper"> 
     <bean class="org.springframework.jdbc.core.ColumnMapRowMapper"/> 
    </property> 
</bean> 

不只是提高分頁的值/獲取大小以上16是有另一種方式配置這個閱讀器返回所有行?

+0

你試過沒有設置FETCHSIZE;看了幾分鐘的代碼,並可能工作 – user1121883

+0

唉 - 我試過(fetchSize默認爲-1),但問題保持不變 – emeraldjava

+0

只是一個問題。爲什麼你需要一個可分頁的閱讀器,如果你需要一個單一的閱讀所有行?使用具有非常高的提交間隔(或自定義CompletionPolicy)的標準jdbc閱讀器 –

回答

3

我有同樣的問題,我需要從表中獲取所有數據,而不是jdbc我使用的是mybatis分頁。事實是,由於我提取的視圖非常複雜。我被要求打(查詢)數據庫一次(分頁需要爲每個頁面執行多個查詢,其中子句是開銷)。因此我增加了頁面大小來容納所有數據,我遇到了內存問題(這很明顯)。由於我沒有使用UI來顯示數據,所以分頁並不是必需的。因此我使用了JDBCCursorItemReader。它查詢表一次並將數據保存在數據庫緩存或臨時表空間中(不是數據庫專家,但由於混亂,我發現結果集緩存在臨時表空間中)。數據將使用結果集(取決於讀取大小)發回給您,您讀取並創建對象,直到提交時間間隔。一旦達到提交間隔,就會寫入數據。接下來它再次從結果集中獲取數據(如果結果集沒有數據,它將根據獲取大小從數據庫中獲取另一個塊),並創建對象(行映射器)直到提交間隔達到,然後調用項目編寫器。因此,我沒有耗盡內存。因此,您可以根據您的內存限制配置提交間隔。我會建議保持fetchsize和commit-interval相同以獲得更好的性能。當我調整fetchsize通過增加我得到更好的執行時間,但不知道它將如何影響其他地方。下面是示例JDBC光標項目讀者

<bean id="cursorReader" class="org.springframework.batch.item.database.JdbcCursorItemReader"> 
     <property name="dataSource" ref="dataSource" /> 
     <property name="sql" value="SELECT C1,C2,C3,C4,C5 FROM KP_TBL_VW" /> 
     <property name="rowMapper" ref="rowMapperDomain" /> 
     <property name="fetchSize" value="50000"/> 
     <property name="driverSupportsAbsolute" value="true" /> 
</bean> 

道歉,如果我的分貝的理解是錯誤