JDBCPagingItemReader 如何取数据
How JDBCPagingItemReader fetches data
我正在处理一个批处理作业,我正在使用步进分区和 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 data WHERE rownumber BETWEEN :fromRow AND :toRow ORDER BY rownumber ASC FETCH FIRST 100 ROWS ONLY
我的问题是
1) 如果提交间隔为 1(这是因为我的业务要求),那么一旦任何线程处理了 100 条记录,该线程将触发另一个查询以获取下一块 100 条记录,否则它将继续触发查询并缓存数据?
2) 在任何特定时间点内存中只有 5 个线程 * 100 个块 = 500 个活动记录?
3) 我正在使用内存作业存储库。在这种情况下是否有避免任何 OutOfMemoryError 的指南或最佳实践?
专家在此寻求您的帮助。提前致谢!
1) 提交间隔为 1 时,单个线程将 select 100 条记录,然后开始处理 and/or 按照步骤中的定义写入它们。该步骤完成后,应触发另一个查询 select 另外 100 条记录。
2) 正确
3) 可以增加运行时分配给 JVM 的内存量。我不确定您是否计划让这个过程在完成时旋转并终止,或者该过程是否会在一段时间内连续 运行。然而,在任何一种情况下,如果这是用于生产级系统,则强烈建议不要使用内存中的 JobRepository。 Spring Batch 的主要好处之一是它能够查看 JobRepository 中的历史记录以重新启动作业,以及开发人员能够将其用作附加数据来确定任何问题工作可能会遇到。
我正在处理一个批处理作业,我正在使用步进分区和 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 data WHERE rownumber BETWEEN :fromRow AND :toRow ORDER BY rownumber ASC FETCH FIRST 100 ROWS ONLY
我的问题是
1) 如果提交间隔为 1(这是因为我的业务要求),那么一旦任何线程处理了 100 条记录,该线程将触发另一个查询以获取下一块 100 条记录,否则它将继续触发查询并缓存数据?
2) 在任何特定时间点内存中只有 5 个线程 * 100 个块 = 500 个活动记录?
3) 我正在使用内存作业存储库。在这种情况下是否有避免任何 OutOfMemoryError 的指南或最佳实践?
专家在此寻求您的帮助。提前致谢!
1) 提交间隔为 1 时,单个线程将 select 100 条记录,然后开始处理 and/or 按照步骤中的定义写入它们。该步骤完成后,应触发另一个查询 select 另外 100 条记录。
2) 正确
3) 可以增加运行时分配给 JVM 的内存量。我不确定您是否计划让这个过程在完成时旋转并终止,或者该过程是否会在一段时间内连续 运行。然而,在任何一种情况下,如果这是用于生产级系统,则强烈建议不要使用内存中的 JobRepository。 Spring Batch 的主要好处之一是它能够查看 JobRepository 中的历史记录以重新启动作业,以及开发人员能够将其用作附加数据来确定任何问题工作可能会遇到。