赞
踩
- 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);
- }
- }
可以将List进行分割,比如5000个分割,然后再分批插入
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查询来解决
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。