如何在Spring批处理中使用JdbcPagingItemReader中的limit和offset子句?
问题描述:
该表拥有超过2亿条记录,但我需要限制选定的前500万条记录。我已经用jdbcCursorItemReader尝试了大约2-3个小时来选择并使用单步处理将其写入csv文件,所以我选择使用并行处理,即春季批量提供。
我,通过让taskExecutor和JdbcPagingItemReader使每个5个单独的文件百万个,但问题是我无法在查询参数中指定限制和偏移量子句。请帮助我。赞赏比这更好的方法。如何在Spring批处理中使用JdbcPagingItemReader中的limit和offset子句?
<bean id="itemReader" class="org.springframework.batch.item.database.JdbcPagingItemReader" scope="step">
<property name="dataSource" ref="dataSource" />
<property name="rowMapper">
<bean class="MyRowMapper" />
</property>
<property name="queryProvider">
<bean class="org.springframework.batch.item.database.support.SqlPagingQueryProviderFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="sortKeys">
<map>
<entry key="esmeaddr" value="ASCENDING"/>
</map>
</property>
<property name="selectClause" value="elect cust_send,dest,msg,stime,dtime,dn_status,mid,rp,operator,circle,cust_mid,first_attempt,second_attempt,third_attempt,fourth_attempt,fifth_attempt,term_operator,term_circle,bindata,reason,tag1,tag2,tag3,tag4,tag5"
/>
<property name="fromClause" value="FROM bill_log " />
<property name="whereClause" value="where esmeaddr = '70897600000000' and country='India' and apptype='SMS' Limit 0,1000000" />
</bean>
</property>
<property name="pageSize" value="1000000" />
<property name="parameterValues">
<map>
<entry key="param1" value="#{jobExecutionContext[param1]}" />
<entry key="param2" value="#{jobExecutionContext[param2]}" />
</map>
</property>
</bean>
答
,因为这就是读者本身都行,你不能使用阅读器内的SQL LIMIT子句。相反,Spring Batch具有内置于JdbcPagingItemReader
中的功能。要设置要处理的项目的最大数量,可以使用JdbcPagingItemReader#setMaxItemCount(5000000)
配置阅读器,如果有偏移量,则可以设置JdbcPagingItemReader#setCurrentItemCount(offset)
。也就是说,偏移将在重新启动时被覆盖,其值在ExecutionContext
中找到。你可以在这里阅读更多关于这个javadoc:https://docs.spring.io/spring-batch/trunk/apidocs/org/springframework/batch/item/database/JdbcPagingItemReader.html
非常感谢@MichealMinella。所提供的链接帮助了我很多。 – geekyKishan