Spring Batch JdbcPagingItemReader - 定义pageSize / fetchSize时不遵守sortKey

时间:2014-02-05 16:29:47

标签: spring-batch

我在弹簧批处理作业中使用分页Jdbc阅读器。我在表中有16行,我希望看到所有行,但下面的配置只返回10。

<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以上,是否有另一种方法可以配置此阅读器以返回所有行?

1 个答案:

答案 0 :(得分:4)

我有同样的问题我需要从表中获取所有数据,而不是jdbc我使用的是mybatis分页。事实是,由于我提取的观点非常复杂。我被要求点击(查询)数据库一次(分页需要为每个页面执行多个查询,where子句是开销)。因此我增加了页面大小来容纳所有数据,我遇到了内存问题(很明显)。由于我没有使用UI来显示数据,因此分页并不是必需的。因此我使用了JDBCCursorItemReader。查询表一次并将数据保存在数据库缓存或临时表空间(不是数据库专家,但由于混乱,我发现结果集缓存在临时表空间中)。使用结果集(它取决于获取大小)将数据发送回给您,您将读取并创建对象直到提交间隔。一旦达到提交间隔,就会写入数据。接下来它再次从结果集中获取数据(如果结果集没有数据,它将根据提取大小从数据库中获取另一个块)并创建对象(行映射器)直到提交间隔到达然后调用项目编写器。因此我没有耗尽内存。因此,您可以根据内存限制配置提交间隔。我建议保持fetchsize和commit-interval相同以获得更好的性能。当我通过增加调整fetchsize时,我获得了更好的执行时间但不确定它将如何影响其他地方。这是示例JDBC游标Item Reader

<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>

如果我的数据库理解错误,请道歉