我们收到“org.postgresql.util.PSQLException:此连接已关闭。” 在我们的一项部署中,仅用于长时间运行的事务(超过几分钟):
Caused by: org.hibernate.TransactionException: rollback failed
at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.rollback(AbstractTransactionImpl.java:217)
at org.springframework.orm.hibernate4.HibernateTransactionManager.doRollback(HibernateTransactionManager.java:604)
... 87 more
Caused by: org.hibernate.TransactionException: unable to rollback against JDBC connection
at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.doRollback(JdbcTransaction.java:167)
at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.rollback(AbstractTransactionImpl.java:211)
... 88 more
Caused by: org.postgresql.util.PSQLException: This connection has been closed.
at org.postgresql.jdbc2.AbstractJdbc2Connection.checkClosed(AbstractJdbc2Connection.java:822)
at org.postgresql.jdbc2.AbstractJdbc2Connection.rollback(AbstractJdbc2Connection.java:839)
at org.apache.commons.dbcp2.DelegatingConnection.rollback(DelegatingConnection.java:492)
at org.apache.commons.dbcp2.DelegatingConnection.rollback(DelegatingConnection.java:492)
at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.doRollback(JdbcTransaction.java:163)
... 89 more
我们的堆栈如下:
- Postgresql 9.2(在数据库服务器 Ubuntu 16.03 上)
- PgBouncer(在应用服务器 Ubuntu 16.03 上)
- 罐子(在应用服务器 Ubuntu 16.03 上)
- org.postgresql:postgresql:9.2-1004-jdbc41
- javax.transaction:jta:1.1
- org.apache.commons:commons-pool2:2.4.2
- org.apache.commons:commons-dbcp2:2.1.1'
Postgresql 和 Pgbouncer 使用默认参数,我们为 dbcp 使用以下参数:
database-initial-size = 2
database-max-total = 200
database-validation-query = SELECT 1
database-test-on-borrow = true
database-test-while-idle = true
database-max-wait-millis = 3000
database-time-between-eviction-runs-millis = 34000
database-min-evictable-idle-time-millis = 55000
我们有其他具有相同参数的部署,但我们没有遇到同样的问题。
我怀疑有一个防火墙/Nat 会在超时后重置连接,但我不知道如何检查是否是这种情况。如果您能指导我检查哪些日志/参数/配置可能导致此异常,我将不胜感激。
我已经测试过,如果 Postgresql 和 PgBouncer 在同一台服务器上,则不会发生此问题。我还调查了 Postgresql 日志,没有记录任何错误消息。