与Postgres数据库的连接丢失

时间:2018-03-21 09:50:10

标签: java postgresql

在性能服务器上 - 相当大的负载,我有一个奇怪的行为。 从一个时刻开始,数据库的所有连接开始说"连接已经关闭"。

到目前为止唯一的提示是此IOException:

Caused by: org.postgresql.util.PSQLException: An I/O error occurred while sending to the backend.
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:314)
    at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:430)
    at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:356)
    at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:168)
    at org.postgresql.jdbc.PgPreparedStatement.executeQuery(PgPreparedStatement.java:116)
    at org.jboss.resource.adapter.jdbc.WrappedPreparedStatement.executeQuery(WrappedPreparedStatement.java:342)
    at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:208)
    at org.hibernate.loader.Loader.getResultSet(Loader.java:1812)
    at org.hibernate.loader.Loader.doQuery(Loader.java:697)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259)
    at org.hibernate.loader.Loader.doList(Loader.java:2232)
    ... 73 more

Caused by: java.io.IOException: Tried to send an out-of-range integer as a 2-byte value: 33001
    at org.postgresql.core.PGStream.sendInteger2(PGStream.java:211)
    at org.postgresql.core.v3.QueryExecutorImpl.sendParse(QueryExecutorImpl.java:1409)
    at org.postgresql.core.v3.QueryExecutorImpl.sendOneQuery(QueryExecutorImpl.java:1729)
    at org.postgresql.core.v3.QueryExecutorImpl.sendQuery(QueryExecutorImpl.java:1294)
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:280)
    ... 83 more

但是我暂时无法将其与某些业务场景联系起来。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

这是PostgreSQL驱动程序限制,查询的最大参数数量是32768.

您的查询超出了此限制 - 并且通过这样做,驱动程序具有关闭连接的不稳定行为。我在使用Hibernate和PostgreSQL的JBoss服务器上遇到了这种情况,并且连接关闭导致连接池的状态相当混乱。

此参数在Parse部分中描述为here: “Int16 - 指定的参数数据类型数”。

解决方案是将该长查询拆分为具有已知数量参数的较小查询。