Pgsql报错:PostgreSQL的SQL语句参数上限报错

2023-11-13

org.postgresql.util.PSQLException: An I/O error occurred while sending to the backend.

Caused by: java.io.IOException: Tried to send an out-of-range integer as a 2-byte value: 50805

问题原因:

Pg数据库的JDBC驱动对参数数量是有上限限制的,最大值为32767

但是Pg数据库本身对参数数量库没有限制的,即在数据库客户端可以执行超过32767个参数的sql

public void sendInteger2(int val) throws IOException {
        if (val >= -32768 && val <= 32767) {
            this.int2Buf[0] = (byte)(val >>> 8);
            this.int2Buf[1] = (byte)val;
            this.pgOutput.write(this.int2Buf);
        } else {
            throw new IOException("Tried to send an out-of-range integer as a 2-byte value: " + val);
        }
    }

解决方案

场景1: 插入数据

可以将List进行分割,比如5000个分割,然后再分批插入

场景2: 查询数据

1. 无分页排序要求

如果查询数据没有分页,排序等需求,可以采用将参数List分割,比如5000个分割,然后分批查询,最后使用代码汇总到一起

2. 有分页排序要求

如果查询有分页排序要求时,我们可以在Java代码中将in里面的参数拼装成字符串,比如'1','2','3'这种,然后使用${ids}的方式拼装sql,就可以避免参数上限问题。

但是这只是临时解决办法,从根本上解决,还是要从表设计来分析,

1)比如能否使用连表查询join来避免参数过多的情况;

2)如果你的参数是从其他库的表查的,然后用查出来的结果再在另外一个库的表查询,那么这种就要看这两个表放在两个库是否符合设计要求

select * from table_a where id = xxx 其中table_a在192.0.0.5上的数据库

select * from table_b where id in ('a','b','c') 其中table_b在192.0.0.6上的数据库,in中的查询条件为上一个sql的查询结果

这种情况就无法使用join来进行查询,也就只能暂时使用第二点开始的解决办法,长期解决方案还是要看下表设计,看看如何优化,以使用join查询来解决

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Pgsql报错:PostgreSQL的SQL语句参数上限报错 的相关文章

随机推荐