当前位置:编程学习 > JAVA >>

struts2+hibernate3异常:Cannot release connection

程序运行一两天后就抛异常如下:请问是怎么回事?

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
--------------------编程问答--------------------   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 参考下吧 --------------------编程问答-------------------- 应该是连接池配置的问题
http://forum.springsource.org/archive/index.php/t-26626.html --------------------编程问答-------------------- hibernate默认连接池在8小时后会自动关掉,在hibernate的开发文档里有说明
所以连接池最好自己配置 --------------------编程问答--------------------

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删除了内置的支持。 --------------------编程问答-------------------- 很明显,报的是没有释放连接! --------------------编程问答-------------------- 谢谢各位的耐心回答,忘了说明一点,链接池我是在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吗? --------------------编程问答-------------------- 明白了,运行个两回来试下,没问题再结贴:) --------------------编程问答-------------------- 2012来啦,楼主结贴吧
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,