当前位置:   article > 正文

Pgsql报错:PostgreSQL的SQL语句参数上限报错_org.postgresql.util.psqlexception: an i/o error oc

org.postgresql.util.psqlexception: an i/o error occurred while sending to th
  1. org.postgresql.util.PSQLException: An I/O error occurred while sending to the backend.
  2. 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

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

解决方案

场景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查询来解决

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/483648
推荐阅读
相关标签
  

闽ICP备14008679号