大型查询时出现Java PostgreSQL错误:发送到后端时发生I / O错误

时间:2016-12-18 00:57:29

标签: java postgresql jdbc limits

在Java中,使用java.sql.PreparedStatement,我正在尝试提交一个相当大的查询,其中包含用于高效连接的常量(VALUES (?), (?), (?)...)表达式。

有cca 250K值,所以我也设置250K参数。

在Java中,我正在

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

在我的服务器PostgreSQL日志中,有一行关于该错误:

incomplete message from client

关于某些设置的任何想法我可以在任何地方更改以使我的大型查询有效吗?

1 个答案:

答案 0 :(得分:3)

JDBC驱动程序可以传递给后端的最大参数数量是32767.这受到v3有线协议的限制,该协议以16位int传递参数计数(请参阅definition of the Bind message的文档)

您可以通过在数组中传递值并在服务器上取消它们来解决此问题:

// Normally this would be one too many parameters
Integer[] ids = new Integer[Short.MAX_VALUE  + 1];
Arrays.setAll(ids, i -> i);
// Pass them in an array as a single parameter and unnest it 
PreparedStatement stmt = con.prepareStatement(
    "WITH ids (id) AS (SELECT unnest (?)) " +
    "SELECT f.* FROM foo f JOIN ids i ON i.id = f.id"
);
stmt.setArray(1, con.createArrayOf("INT", ids));