1

我们收到“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 日志,没有记录任何错误消息。

4

0 回答 0