Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Guice JPA-“;此连接已关闭。”;错误_Jpa_Guice_Guice Persist - Fatal编程技术网

Guice JPA-“;此连接已关闭。”;错误

Guice JPA-“;此连接已关闭。”;错误,jpa,guice,guice-persist,Jpa,Guice,Guice Persist,DB断开空闲连接或DB关闭并备份后,我在我的webapp中收到以下错误: javax.persistence.PersistenceException: org.hibernate.exception.JDBCConnectionException: could not inspect JDBC autocommit mode at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.

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清除池,但似乎没有任何效果。 另一件奇怪的事情是,尽管应用程序显然没有做任何事情(通过线程转储检查),但JMXbean显示了7个活动连接和0个空闲连接。当我执行一个需要DB访问的请求时,我立即得到一个响应(尽管没有可用的空闲连接),但是JMX显示了7个活动连接和0个空闲连接


另外,也许我遗漏了一些明显的东西,这是我的连接管理问题?我使用的是通过persistence.xml配置的JPA EntityManager,因此可能是我做错了什么,使用后连接没有正确关闭(返回)?

如果您修改了
META-INF/context.xml
以包含
验证查询
,Tomcat可能正在
conf/engine/host/webapp.xml
下缓存旧定义。关闭Tomcat,删除该文件,然后重新启动Tomcat。在Tomcat也关闭时删除
工作
目录不会有什么坏处。

一个粗略的操作:代码建议也检查
验证间期
,以查看
testOnBorrow

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

为了测试这一理论,您可以将
validationInterval
设置为一个荒谬的低值

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


注:我刚向谷歌索要代码。我不知道这是真正的代码还是古老的代码。

事实上,当我怀疑有应用程序错误时,我是对的

这一切都被很好地描述了出来

使用JpaPersistService时,如果尝试访问 活动工作单元之外的EntityManager,Guice将 自动为您启动一个。但是,由于Guice没有(以及 无法)知道何时结束这项工作,它永远不会

结果如何?有问题的线程将被同一个EntityManager卡住 在应用程序的整个生命周期内。这是一个糟糕的状态 应用程序运行时,我们不可避免地会耗尽可用的资源 记忆过了一会儿就崩溃了

这里真正的杀手是,当你做出决定时,这一点都不明显 这个错误。唯一真正的提示是你得到了 不同线程之间数据库中的数据不一致(由于 EMs一级缓存)或应用程序内存消耗 继续成长。 在我的例子中,池中的活动连接让我怀疑它,然后,当我打开详细日志记录时,我注意到应用程序根本没有从池中借用连接,而是在重用未关闭的EntityManager已经拥有的连接


事实上,报告的这个问题有很多重复的地方:

我不认为是这样的-它在多台服务器上发生过多次(其间重启)。另外,自初始部署以来,我没有修改validationQuery。它也可用,而不是查看SpringSource的er副本。看起来@A.H.可能走上了正确的轨道:验证间隔也适用于借阅时验证,至少在使用Tomcat的jdbc-pool时是如此。很抱歉这么大惊小怪,但我也不这么认为。我让服务器在这种情况下运行了超过12小时,并让脚本每10分钟调用一次。在整个过程中,我每小时都会犯2到3个错误。尽管如此,我还是会尝试设置一个较低的值,看看会发生什么。我已经通过JMX将validationInterval设置为1,而一个实例在池中以坏连接运行。它没有改变任何事情你是如何解决这个错误的?