在 DB 断开空闲连接或 DB 关闭并备份后,我在我的 webapp 中收到以下错误:
javax.persistence.PersistenceException: org.hibernate.exception.JDBCConnectionException: could not inspect JDBC autocommit mode
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1365)
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1293)
at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:265)
... 60 more
Caused by: org.hibernate.exception.JDBCConnectionException: could not inspect JDBC autocommit mode
at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:131)
at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110)
at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.isAutoCommit(LogicalConnectionImpl.java:395)
at org.hibernate.engine.transaction.internal.TransactionCoordinatorImpl.afterNonTransactionalQuery(TransactionCoordinatorImpl.java:195)
at org.hibernate.internal.SessionImpl.afterOperation(SessionImpl.java:565)
at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1220)
at org.hibernate.internal.QueryImpl.list(QueryImpl.java:101)
at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:256)
... 70 more
Caused by: org.postgresql.util.PSQLException: This connection has been closed.
at org.postgresql.jdbc2.AbstractJdbc2Connection.checkClosed(AbstractJdbc2Connection.java:712)
at org.postgresql.jdbc2.AbstractJdbc2Connection.getAutoCommit(AbstractJdbc2Connection.java:678)
at sun.reflect.GeneratedMethodAccessor138.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.apache.tomcat.jdbc.pool.ProxyConnection.invoke(ProxyConnection.java:126)
at org.apache.tomcat.jdbc.pool.JdbcInterceptor.invoke(JdbcInterceptor.java:99)
at org.apache.tomcat.jdbc.pool.DisposableConnectionFacade.invoke(DisposableConnectionFacade.java:63)
at $Proxy66.getAutoCommit(Unknown Source)
at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.isAutoCommit(LogicalConnectionImpl.java:392)
当这开始时,我得到一个
SQL Error: 0, SQLState: 08006 - An I/O error occured while sending to the backend.
但在那之后它只是:
SQL Error: 0, SQLState: 08003 - This connection has been closed.
问题是:我已经设置了 testOnBorrow,所以我希望只获得打开的连接。
如果这有帮助:池通常包含好连接和坏连接,问题似乎随着时间的推移而消失,但我让服务器运行了 >12 小时,但仍然返回了坏连接。重新启动后一切正常(一段时间)。
我已经对问题进行了更多调试,似乎池返回了错误的连接,例如,如果我在 DB 上杀死了所有连接后,我得到:
SQL Error: 0, SQLState: 57P01
然后是通常的东西 - 从池中返回被杀死的连接。问题是:这是应用程序问题吗?
我尝试通过 JMX 清除池,但这似乎没有任何效果。另一个奇怪的事情是,即使应用程序显然没有做任何事情(通过线程转储检查),JMX bean 仍显示 7 个活动连接和 0 个空闲连接。当我执行一个需要访问数据库的请求时,我会立即得到响应(尽管没有可用的空闲连接),但之后 JMX 显示 7 个活动连接和 0 个空闲连接。
PS。也许我遗漏了一些明显的东西,这是我的连接管理问题?我正在使用通过 persistence.xml 配置的 JPA EntityManager,所以也许我做错了什么并且使用后连接没有正确关闭(返回)?