JDBCPagingItemReader如何获取数据

时间:2016-05-25 19:07:24

标签: spring-batch

我正在进行批处理作业,我正在使用步骤分区和JDBCPagingItemReader用于数据提取,页面大小为100,线程数为5.我在调试模式下运行程序,在DB中找到3000条记录,发现每个线程都是触发以下查询以从数据库中获取数据。

SELECT * FROM(SELECT CASE_NUM,STTS_CD,UPDT_TS,OFC_CD,OFC_NUM,CHNL_CD,APRV_OFC_CD,APRV_OFC_NUM,TYP_CD,ROW_NUMBER()OVER(ORDER BY CASE_NUM)AS rownumber FROM T_CASE WHERE PROC_INDX ='P')AS数据WHERE rownumber BETWEEN:fromROW AND:toRowumber by rownumber ASC FETCH FIRST 100 ROWS

我的问题是

1)如果提交间隔为1(这是因为我的业务需求),那么一旦100个记录被任何线程处理,那么该线程将触发另一个查询以获取100个记录的下一个块,否则它将继续触发查询和缓存数据?

2)在任何特定时间点内存中只有5个线程* 100个块= 500个活动记录?

3)我在内存作业库中使用。在这种情况下是否有任何指导方针或最佳做法可以避免任何OutOfMemoryError?

专家在这里寻求帮助。提前谢谢!

1 个答案:

答案 0 :(得分:0)

1)如果提交间隔为1,则单个线程将选择100条记录,然后按照步骤中的定义开始处理和/或写入它们。完成Step后,应该触发另一个查询以选择另外100条记录。

2)这是正确的

3)可以增加在运行时为JVM提供的内存量。我不确定你是否计划将这个过程旋转并在完成时被杀死,或者过程是否会在一段时间内连续运行。但是,在任何一种情况下,如果这是用于生产级系统,则强烈建议不要使用内存JobRepository。 Spring Batch的主要优点之一是能够查看JobRepository中的历史记录以重新启动作业,以及开发人员在确定作业可能遇到的任何问题时将其用作附加数据的能力。