分页不适用于春季批处理中的JpaPagingItemReader和jpql请求

问题描述

我有一个无法解决的问题。我使用PostGresql和Spring批处理,尤其是使用jpaPagingItemReader来通过JPA中的分页读取数据库中的内容。 为了优化性能,我还使用了分区程序来读取分区中的数据库。因此,每个分区将使用jpaPagingItemReader从数据库读取关联的间隔。由于我的基本ID是不连续的,因此分区程序会创建包含ID列表的分区。

因此JpaPagingItemReader会执行 SELECT c FROM Entity c WHERE c.id IN: ids 带有 pageSize(10) parameterValues 的ID,该ID包含该分区给定ID列表中的ID。 我的pageSize的值等于我的块的值。

这是我的问题所在,如下。 我的分区可能包含很大的ID列表,因此有时会出现错误"java.io.IOException: Tried to send an out-of-range integer as a 2-byte value" 这是有道理的,因为从技术上讲,我超过了resultSet中PostGresql所允许的最大值。 我不明白的是,分页应该避免此问题,因为我将JpaPagingItemReader的页面大小设为10

另一方面,对于同一个分区列表,当我的JpaPagingItemReader接受SELECT c FROM Entity c WHERE c.id IN (id1,id2,id3,...,idn)具有相同页面大小(10)的本机查询时,批处理开始良好并且处理完成没有PostGresql错误

好像分页在jpql上不起作用,而在Nativesql上起作用。

可能我的分析是错误的。

请帮助。

解决方法

我想说,这个问题与分页和响应大小无关,而与请求本身无关。 PostgreSql对每个语句的绑定变量数有限制(32767),IN子句已超出该限制。您可以通过限制分区大小来解决它。