问题描述
我有一个无法解决的问题。我使用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子句已超出该限制。您可以通过限制分区大小来解决它。