导致此错误的原因是什么java.lang.IllegalStateException:尝试返回未知的connection2?

时间:2012-01-09 08:51:22

标签: hibernate jboss

在运行我的应用时,我遇到了这种错误。 它偶尔发生,所以我不知道我的代码到底是什么错误。 该例外并未说明任何明确的细节。

堆栈跟踪的一部分。

java.lang.IllegalStateException: Trying to return an unknown connection2! org.jboss.resource.adapter.jdbc.jdk6.WrappedConnectionJDK6@c74ff1
    at org.jboss.resource.connectionmanager.CachedConnectionManager.unregisterConnection(CachedConnectionManager.java:330)
    at org.jboss.resource.connectionmanager.TxConnectionManager$TxConnectionEventListener.connectionClosed(TxConnectionManager.java:720)
    at org.jboss.resource.adapter.jdbc.BaseWrapperManagedConnection.closeHandle(BaseWrapperManagedConnection.java:362)
    at org.jboss.resource.adapter.jdbc.WrappedConnection.close(WrappedConnection.java:155)
    at org.hibernate.connection.DatasourceConnectionProvider.closeConnection(DatasourceConnectionProvider.java:97)

是否有人在请求帮助之前发生了这个错误。 我使用jboss 6,seam 2,jsf 2和richfaces 3。

1 个答案:

答案 0 :(得分:10)

JBoss wiki回答了这个问题。这是一个相关的引用:

  

许多持久性框架(Hibernate2 / OBJ)随机打开和关闭连接。就JBoss而言,它看起来像一个ejb分配了连接而另一个关闭了它。连接关闭检查不理解此行为。它期望分配连接的相同ejb也关闭它。

     

如果您使用这样的模式或此类框架,您可以关闭此消息(请参阅下文),但在检测连接泄漏时您可以自行处理。从3.2.6开始,CachedConnectionManager上有一个“listInUseConnections()”。

     

但是,这个known issue有一些事务划分语义。这实际上不是JBoss的用法,更多的是ThreadLocal模式绕过J2EE语义。

     

如果遇到问题,从conf / standardjboss.xml中的拦截器堆栈中删除CachedConnectionInterceptor将解决虚假消息。特别是对于Hibernate2,这是安全,因为您可以信任hibernate,至少可以正确地关闭连接,只要您正确地结束用户事务。

     

要删除CachedConnectionInterceptor,请编辑conf / standardjboss.xml并删除对拦截器的所有引用。这些看起来像:

<container-configuration>
  <container-name>Standard Stateless SessionBean</container-name>
  <call-logging>false</call-logging>
  <invoker-proxy-binding-name>stateless-http-invoker</invoker-proxy-binding-name>
  <container-interceptors>
    ...
    <interceptor>org.jboss.resource.connectionmanager.CachedConnectionInterceptor</interceptor>
     

Hibernate3提供other mechanisms来管理会话(和连接),因此很容易避免这个问题。