程序运行一两天后就抛异常如下:请问是怎么回事?org.hibernate.exception.GenericJDBCException: Cannot release connection
        at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:126)
        at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:114)
        at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
        at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:52)
        at org.hibernate.jdbc.ConnectionManager.closeConnection(ConnectionManager.java:478)
        at org.hibernate.jdbc.ConnectionManager.aggressiveRelease(ConnectionManager.java:429)
        at org.hibernate.jdbc.ConnectionManager.afterTransaction(ConnectionManager.java:316)
        at org.hibernate.jdbc.JDBCContext.afterNontransactionalQuery(JDBCContext.java:268)
        at org.hibernate.impl.SessionImpl.afterOperation(SessionImpl.java:444)
        at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1153)
        at org.hibernate.impl.QueryImpl.list(QueryImpl.java:102)
        at cn.reforger.system.menu.MenuDeal.menuList(MenuDeal.java:42)
        at cn.reforger.system.menu.MenuAction.menuList(MenuAction.java:22)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:404)
        at com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:267)
        at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:229)
        at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:221)
        at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86)
        at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
        at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
        at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
        at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
        at com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:150)
        at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:48)
        at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86)
        at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
        at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
        at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
        at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
        at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:123)
        at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
        at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
        at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
        at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
        at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:184)
        at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86)
        at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
...................
...................
...省略若干行,错误信息跟上面差不多...
...................
...................Caused by: java.sql.SQLException: Already closed.
        at org.apache.tomcat.dbcp.dbcp.PoolableConnection.close(PoolableConnection.java:84)
        at org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.close(PoolingDataSource.java:181)
        at org.hibernate.connection.DatasourceConnectionProvider.closeConnection(DatasourceConnectionProvider.java:97)
        at org.hibernate.jdbc.ConnectionManager.closeConnection(ConnectionManager.java:474)
        ... 120 more

解决方案 »

  1.   

      Cannot release connection 
        很明显是你的连接池配置出问题了啊
        可以把空闲的连接池放掉啊
         
         <property name="initialSize">
         <value>5</value>
    </property>
    <property name="maxActive">
    <value>10</value>
    </property>
    <!-- 最大空闲连接 -->
    <property name="maxIdle">
    <value>5</value>
    </property>
    <property name="minIdle">
    <value>5</value>
    </property>
    <!-- 超时等待时间以毫秒为单位 -->
    <property name="maxWait">
    <value>1000</value>
    </property>
    <!-- 是否自动回收超时连接 -->
    <property name="removeAbandoned">
    <value>true</value>
    </property>
    <property name="removeAbandonedTimeout">
    <value>2000</value>
    </property>
        
        LZ 参考下吧
      

  2.   

    应该是连接池配置的问题
    http://forum.springsource.org/archive/index.php/t-26626.html
      

  3.   

    hibernate默认连接池在8小时后会自动关掉,在hibernate的开发文档里有说明
    所以连接池最好自己配置
      

  4.   


    tomcat 的数据源定义提供了三个参数:
       a.  如果设为true则tomcat自动检查恢复重新利用,没有正常关闭的Connection.(默认是false)
                 〈parameter〉
                  〈name〉removeAbandoned〈/name〉
                  〈value〉true〈/value〉
                〈/parameter〉
        b. 设定连接在多少秒内被认为是放弃的连接,即可进行恢复利用。
                〈parameter〉
                  〈name〉removeAbandonedTimeout〈/name〉
                  〈value〉60〈/value〉
                〈/parameter〉
        c. 输出回收的日志,可以详细打印出异常从而发现是在那里发生了泄漏
                    〈parameter〉
                  〈name〉logAbandoned〈/name〉
                  〈value〉true〈/value〉
                〈/parameter〉很多人建议,如果必须使用dbcp,那就用,如果不是,就更换成c3p0,
    也有人在blog上这样写道: 
    使用DBCP连接池后访问速度提高了100-150%,但是实验表明,如果负载压力达到实际负荷的10倍以上,即超出内设的最大连接数10倍左右,DBCP原因不明地崩溃,并常常不能最终恢复服务。原因之一是由于在高负载下,DBCP把已经关闭或过时的连接返回给呼叫者,造成流溢出,从而令所有IO进程悬挂。唯一的办法就是重启tomcat。 
    hibernate的官方网站Gavin的文章也说是由于dbcp数据源有问题,hibernate3删除了内置的支持。
      

  5.   

    谢谢各位的耐心回答,忘了说明一点,链接池我是在tomcat的server.xml中配置的,如下:
    <Context path="" docBase="D:\project\reforger\WebRoot" debug="0"
            privileged="true" reloadable="true" crossContext="true">
      <Resource name="jdbc/reforger" auth="Container" type="javax.sql.DataSource" username="root" password="" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/reforger" maxActive="150" maxIdle="50" />
    </Context>然后直接在hibernate.xml中引用,如下:
    <property name="connection.datasource">
        java:comp/env/jdbc/reforger
    </property>
    <property name="show_sql">true</property>
    <property name="dialect">
        org.hibernate.dialect.MySQLDialect
    </property>请问下,这种情况应该怎样配置?
    还是直接在hibernate中加入三个参数removeAbandoned,removeAbandonedTimeout,logAbandoned吗?