该表有超过2亿条记录,但我需要限制选择前500万条记录。我尝试过使用jdbcCursorItemReader大约2-3小时来选择并使用单步处理将其写入csv文件,所以我选择使用并行处理,即spring是批量提供。
我,通过让taskExecutor和JdbcPagingItemReader分别制作每个5个单独的文件,但问题是我无法在查询参数中指定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>
答案 0 :(得分:0)
您不能在该阅读器中使用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