kxbin
成功留给有准备的人
posts - 10,  comments - 35,  trackbacks - 0

org.hibernate.exception.GenericJDBCException: Cannot release connection

问题:
    系统采用Spring MVC 2.5 + Spring 2.5 + Hibernate 3.2架构,其中数据源连接池采用的是Apache commons DBCP。问题是这样的,系统运行一段时间后(大致每隔8小时),访问系统会出现如下错误,再次访问恢复正常。
  1. org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.hibernate.exception.GenericJDBCException: Cannot release connection  
  2.  at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:583)  
  3.  at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:501)  
  4.  at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)  
  5.  at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)  
  6.  at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)  
  7.  at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)  
  8.   
  9. Caused by: org.hibernate.exception.GenericJDBCException: Cannot release connection  
  10.  at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:103)  
  11.  at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:91)  
  12.  at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)  
  13.  at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:29)  
  14.  at org.hibernate.jdbc.ConnectionManager.closeConnection(ConnectionManager.java:449)  
  15.  at org.hibernate.jdbc.ConnectionManager.cleanup(ConnectionManager.java:379)  
  16.  at org.hibernate.jdbc.ConnectionManager.manualDisconnect(ConnectionManager.java:333)  
  17.  at org.hibernate.impl.SessionImpl.disconnect(SessionImpl.java:375)  
  18.  at org.springframework.orm.hibernate3.HibernateTransactionManager.doCleanupAfterCompletion(HibernateTransactionManager.java:744)  
  19.  at org.springframework.transaction.support.AbstractPlatformTransactionManager.cleanupAfterCompletion(AbstractPlatformTransactionManager.java:989)  
  20.  at org.springframework.transaction.support.AbstractPlatformTransactionManager.processRollback(AbstractPlatformTransactionManager.java:855)  
  21.  at org.springframework.transaction.support.AbstractPlatformTransactionManager.rollback(AbstractPlatformTransactionManager.java:800)  
  22.  at org.springframework.transaction.interceptor.TransactionAspectSupport.completeTransactionAfterThrowing(TransactionAspectSupport.java:339)  
  23.  at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)  
  24.  at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)  
  25.  at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89)  
  26.  at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)  
  27.  at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:635)  
  28.  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)  
  29.  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)  
  30.  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)  
  31.  at java.lang.reflect.Method.invoke(Method.java:585)  
  32.  at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.doInvokeMethod(HandlerMethodInvoker.java:421)  
  33.  at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:136)  
  34.  at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:326)  
  35.  at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:313)  
  36.  at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:875)  
  37.  at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:807)  
  38.  at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:571)  
  39.   36 more  
  40. Caused by: java.sql.SQLException: Already closed.  
  41.  at org.apache.commons.dbcp.PoolableConnection.close(PoolableConnection.java:77)  
  42.  at org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.close(PoolingDataSource.java:180)  
  43.  at org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider.closeConnection(LocalDataSourceConnectionProvider.java:96)  
  44.  at org.hibernate.jdbc.ConnectionManager.closeConnection(ConnectionManager.java:445)  
  45.   62 more  
解决:

    造成Cannot release connection的原因有很多,要具体问题具体分析。从异常分析,造成这个异常 org.hibernate.exception.GenericJDBCException: Cannot release connection 归根结底是Caused by: java.sql.SQLException: Already closed. 即连接已关闭。所以解决的办法就要从DBCP的参数配置入手,见下面的参数配置properties文件。

 

  1. #### :: Apache DBCP :: ####  
  2. jdbc.driverClassName=oracle.jdbc.driver.OracleDriver  
  3. jdbcjdbc.url=jdbc:oracle:thin:@10.165.153.9:1521:PRDC  
  4. jdbc.username=guser  
  5. jdbc.password=guser  
  6. #初始化连接  
  7. jdbc.initialSize=0  
  8. #连接池的最大活动个数  
  9. jdbc.maxActive=20  
  10. #没有人用连接的时候,最大闲置的连接个数。  
  11. jdbc.maxIdle=100  
  12. #没有人用连接的时候,最小闲置的连接个数。  
  13. jdbc.minIdle=0  
  14. #超时等待时间以毫秒为单位  
  15. jdbc.maxWait=10000  
  16. #是否自动回收超时连接  
  17. jdbc.removeAbandoned=true  
  18. #设置被遗弃的连接的超时的时间(以秒数为单位),即当一个连接被遗弃的时间超过设置的时间,则它会自动转换成可利用的连接。默认的超时时间是300秒。  
  19. jdbc.removeAbandonedTimeout=60  
  20. #是否在自动回收超时连接的时候打印连接的超时错误  
  21. jdbc.logAbandoned = true  
  22. #给出一条简单的sql语句进行验证  
  23. jdbc.validationQuery=select 1 from dual  
  24. #在取出连接时进行有效验证  
  25. jdbc.testOnBorrow=true  
其中标红的两个参数的作用是对池化连接进行验证,This will ensure that DBCP only hands out good connections to Hibernate. 故加上这两个参数后,这个异常就不会再出现了。在Spring中指定数据源如下:

 

 

  1. <!--  使用Apache DBCP連接池 -->  
  2.     <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">  
  3.         <property name="driverClassName" value="${jdbc.driverClassName}" />  
  4.         <property name="url" value="${jdbc.url}" />  
  5.         <property name="username" value="${jdbc.username}" />  
  6.         <property name="password" value="${jdbc.password}" />  
  7.         <property name="maxActive" value="${jdbc.maxActive}" />  
  8.         <property name="maxIdle" value="${jdbc.maxIdle}" />  
  9.         <property name="maxWait" value="${jdbc.maxWait}" />  
  10.         <property name="removeAbandoned" value="${jdbc.removeAbandoned}" />  
  11.         <property name="removeAbandonedTimeout" value="${jdbc.removeAbandonedTimeout}" />  
  12.         <property name="logAbandoned" value="${jdbc.logAbandoned}" />  
  13.         <property name="validationQuery" value="${jdbc.validationQuery}" />  
  14.         <property name="testOnBorrow" value="${jdbc.testOnBorrow}" />  
  15.     </bean>  

 

posted on 2011-12-09 09:01 kxbin 阅读(3859) 评论(0)  编辑  收藏 所属分类: J2EE

只有注册用户登录后才能发表评论。


网站导航:
 
你恨一个人是因为你爱他;你喜欢一个人,是因为他身上有你没有的;你讨厌一个人是因为他身上有你有的东西;你经常在别人面前批评某人,其实潜意识中是想接近他。

<2024年11月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

常用链接

留言簿(5)

随笔档案

文章分类

文章档案

相册

收藏夹

J2EE

java技术网站

Linux

平时常去的网站

数据库

电影网站

网站设计

搜索

  •  

最新评论

阅读排行榜

评论排行榜