我在弹簧批处理作业中使用分页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以上,是否有另一种方法可以配置此阅读器以返回所有行?
答案 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>
如果我的数据库理解错误,请道歉