异常信息:
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: 50800
问题原因:
Pg数据库的JDBC驱动对参数数量是有上限限制的,最大值为32767
但是Pg数据库本身对参数数量库没有限制的,即在数据库客户端可以执行超过32767个参数的sql
解决方法:
第一种:
可以将集合进行分割,比如5000个分割,然后再分批插入(多个集合或者分页这种不行)
第二种:
将集合参数拼装成字符串,比如'1','2','3'或者1,2,3,然后使用将in和(${ids} )组装成sql(无法防止sql注入),可以搞定。
第三种:
进行join查询(不是一个数据库,需要建dblink或者fdw,效率不高)
第四种:
开发时,应该尽量避免这种查询,如果出现这种查询,应该首先考虑是不是设计有问题