【发布时间】:2021-11-03 21:15:32
【问题描述】:
我遇到了与此问题中所述类似的问题。 Spring batch jpaPagingItemReader why some rows are not read?
我必须从表格中读取一些记录,例如
SELECT * FROM TABLE1 WHERE COLUMN1 = NULL
并根据其他列的值,进行一些处理(连接到 REST 服务)并获取一些数据并在 COLUMN1 中更新。
由于我使用RepositoryItemReader 和taskExecutor,因此分页获取无法正常工作,并且大约一半的记录被从实际符合条件的记录中跳过。
为了避免这个问题,我将查询减少到SELECT * FROM TABLE1,这样分页就不会受到影响,因为查询将是幂等的。如果该列不为空,我将签入代码以跳过记录。即使使用此设置,记录仍会被跳过。
此外,仅当页面大小小于实际记录数时,才会出现此问题。
如果我保持页面大小大于或等于合格记录的总数,我不会遇到任何问题。我不确定这么大的页面大小(~100000)是否明智。
我注意到在这种情况下,单个查询检索所有记录,然后 taskExecutors 处理并在不同线程中写入这些记录。
由于数据量大,我无法避免多线程,因为单线程模式非常慢。
任何指针可以做什么?
【问题讨论】:
-
这能回答你的问题吗? stackoverflow.com/questions/68744338/…
-
是的,我知道使用非幂等查询的影响。我从查询中删除了更改的列并将它们移至处理器。如果我使用 taskExecutor,每个线程会读取它自己的块吗?我的意思是每个线程都会有自己的read、process、flow?如何保证在多线程环境下,每个线程同步读取页面?
标签: java database multithreading spring-data-jpa spring-batch