Guice JPA - "This connection has been closed."错误



db droppps后一个闲置连接或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,所以我希望只能获得开放连接。

如果有帮助:池USUSALY包含好和坏连接的混合,并且问题随着时间的流逝而清除,但是我的服务器运行> 12h,并且仍然返回了不良的连接。重新启动后,旺盛工作正常(一段时间)。

我已经对问题进行了一些调试,似乎Pool正在返回不良的连接,例如如果我在DB上遇到所有连接后,我会得到:

SQL Error: 0, SQLState: 57P01

然后是通常的东西 - 杀死的连接从游泳池返回。问题是:它是应用程序问题吗?

我尝试通过JMX清除池,但这似乎没有任何效果。另一个奇怪的是,即使应用显然没有做任何事情(通过线程转储检查)JMX BEAN仍显示7个活动连接和0个空闲连接。当我执行需要DB访问的请求时,我会立即得到响应(Depite没有空闲连接),但是JMX显示了7个活动和0个空闲连接。

ps。也许我缺少一些明显的东西,这是我的连接管理问题?我正在使用通过persistence.xml配置的JPA EntityManager,所以也许我在使用错误,并且使用后连接未正确关闭(返回)?

实际上,当我怀疑申请错误时我是对的。

在第730期中都很好地降低了:自动启动单位工程永远不会结束

使用JpaperSistService时,如果您尝试访问 EntityManager在主动单位之外,Guice Will 自动为您开始一个。但是,由于Guice没有(并且 不能)知道何时结束此单位工程,从来没有。

结果?有问题的线将被同一实体属于 在应用程序的整个生命中。这是一个不好的状态 运行的申请,我们不可避免地会用尽 一段时间后的内存并崩溃。

真正的杀手是,当您制作时,它根本不明显 这个错误。唯一真正的小费是您得到了 从不同线程之间的数据库中的数据不一致(由于 EMS第一级缓存)或应用程序内存消耗 不断成长。 就我而言,是池中的主动连接使我怀疑它,然后,当我打开详细的登录时,我注意到应用程序根本没有从池借用连接,而是重复使用已经持有的连接未锁定的EntityManager。

实际上有很多重复的此问题报告:http://code.google.com/p/google-guice/issues/sissues/list?can = 1&q = unitofwork

狂野射击:此处的代码建议,还检查了validationIntervaltestOnBorrow

由于您将此值设置为从30秒默认值设置为5分钟,这意味着在DB丢弃连接后5分钟,您仍然可以获得该陈旧的连接。如果您的DB超时小于5分钟...运气不好。

为了测试此理论,您可以将validationInterval设置为可笑的低值。

如果有帮助(阅读:我们找到了正确的旋钮),则应将其设置为至少比DB超时时间更短的时间。因此,当数据库决定丢弃空闲连接时,较低的validationInterval将确保在下一次借用之前检查连接。由于DB服务器重新启动而引起的封闭连接(即没有超时)不会受到此解决方案的影响,但至少返回理智状态的时间也较低。

注意:我只是向Google询问了代码。我不知道这是实际的代码还是古老的代码。

如果您已将META-INF/context.xml修改为包括validationQuery,则Tomcat可能会在conf/engine/host/webapp.xml下缓存旧定义。关闭tomcat,删除该文件,然后重新启动tomcat。tomcat也下降时删除work目录也不会受到伤害。

相关内容

最新更新