2013-07-04 94 views
0

周围的一些要求服务于重负载时服务器开始持续显示这些错误......强大的文本连接池被耗尽,无法接收免费连接

这是一个堆栈跟踪:

Caused by: java.util.NoSuchElementException: Timeout waiting for idle object 
    at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:1144) 
    at org.apache.commons.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:106) 
    ... 62 more 
org.springframework.jdbc.UncategorizedSQLException: Hibernate operation: Cannot open connection; uncategorized SQLException for SQL [???]; SQL state [null]; error code [0]; Cannot get a connection, pool error Timeout waiting for idle object; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot get a connection, pool error Timeout waiting for idle object 
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:83) 
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80) 
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80) 
    at org.springframework.orm.hibernate3.HibernateAccessor.convertJdbcAccessException(HibernateAccessor.java:424) 
    at org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:410) 
    at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:411) 
    at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374) 
    at org.springframework.orm.hibernate3.HibernateTemplate.find(HibernateTemplate.java:912) 
    at org.springframework.orm.hibernate3.HibernateTemplate.find(HibernateTemplate.java:904) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at org.apache.cxf.service.invoker.AbstractInvoker.performInvocation(AbstractInvoker.java:173) 
    at org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:89) 
    at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:153) 
    at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:87) 
    at org.apache.cxf.interceptor.ServiceInvokerInterceptor$1.run(ServiceInvokerInterceptor.java:58) 
    at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) 
    at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source) 
    at java.util.concurrent.FutureTask.run(Unknown Source) 
    at org.apache.cxf.workqueue.SynchronousExecutor.execute(SynchronousExecutor.java:37) 
    at org.apache.cxf.interceptor.ServiceInvokerInterceptor.handleMessage(ServiceInvokerInterceptor.java:106) 
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:255) 
    at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:113) 
    at org.apache.cxf.transport.servlet.ServletDestination.invoke(ServletDestination.java:97) 
    at org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:461) 
    at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:149) 
    at org.apache.cxf.transport.servlet.AbstractCXFServlet.invoke(AbstractCXFServlet.java:148) 
    at org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:179) 
    at org.apache.cxf.transport.servlet.AbstractHTTPServlet.doGet(AbstractHTTPServlet.java:108) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:617) 
    at org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:159) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293) 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861) 
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:606) 
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) 
    at java.lang.Thread.run(Unknown Source) 
Caused by: org.apache.commons.dbcp.SQLNestedException: Cannot get a connection, pool error Timeout waiting for idle object 
    at org.apache.commons.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:114) 
    at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044) 
    at org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider.getConnection(LocalDataSourceConnectionProvider.java:81) 
    at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:446) 
    at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:167) 
    at org.hibernate.jdbc.AbstractBatcher.prepareQueryStatement(AbstractBatcher.java:161) 
    at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1700) 
    at org.hibernate.loader.Loader.doQuery(Loader.java:801) 
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:274) 
    at org.hibernate.loader.Loader.doList(Loader.java:2533) 
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2276) 
    at org.hibernate.loader.Loader.list(Loader.java:2271) 
    at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:452) 
    at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:363) 
    at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:196) 
    at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1268) 
    at org.hibernate.impl.QueryImpl.list(QueryImpl.java:102) 
    at org.springframework.orm.hibernate3.HibernateTemplate$30.doInHibernate(HibernateTemplate.java:921) 
    at org.springframework.orm.hibernate3.HibernateTemplate$30.doInHibernate(HibernateTemplate.java:1) 
    at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:406) 
    ... 44 more 
Caused by: java.util.NoSuchElementException: Timeout waiting for idle object 
    at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:1144) 
    at org.apache.commons.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:106) 
    ... 63 more 

这些都是春季和休眠依赖我使用

  • 春天3.1.0
  • 公地DBCP-1.4.jar
  • hibernate-3.6.1.Final
  • 使用mysql-connector-java的5.1.2.jar

我使用这些配置对于处理的请求......在applicationContext.xml中

<bean id="springDS" 
    class="org.springframework.jdbc.datasource.DriverManagerDataSource" 
    lazy-init="true"> 
    <property name="driverClassName"> 
     <value>com.mysql.jdbc.Driver</value> 
    </property> 
    <property name="url"> 
     <value>jdbc:mysql://xxxxx/xxxxxx 
     </value> 
    </property> 
    <property name="username"> 
     <value>xxxxxx</value> 
    </property> 
    <property name="password"> 
     <value>xxxxx</value> 
    </property> 
</bean> 



<bean id="dbcpDS" class="org.apache.commons.dbcp.BasicDataSource" 
    destroy-method="close" lazy-init="true"> 
    <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
    <property name="url" value="jdbc:mysql://xxxx/xxxx"/> 
    <property name="username" value="xxxxxx" /> 
    <property name="password" value="xxxxx" /> 
    <property name="initialSize" value="10" /> 
    <property name="maxActive" value="200" /> 
    <property name="maxIdle" value="50" /> 
    <property name="minIdle" value="10" /> 
    <property name="maxWait" value="10000" /> 
</bean> 

<!-- Hibernate SessionFactory --> 
<bean id="sessionFactory" 
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean" 
    lazy-init="true"> 

      <property name="dataSource"> 
     <ref local="dbcpDS" /> 
    </property> 

    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect 
      </prop> 
      <prop key="hibernate.hbm2ddl.auto">validate</prop> 
      <prop key="hibernate.show_sql">false</prop> 
      <prop key="hibernate.connection.isolation">2</prop> 
      <prop key="hibernate.connection.release_mode">after_transaction</prop> 

      <!-- prop key="hibernate.c3p0.min_size">5</prop> <prop key="hibernate.c3p0.max_size">100</prop> 
       <prop key="hibernate.c3p0.timeout">1800</prop> <prop key="hibernate.c3p0.max_statements">100</prop --> 
     </props> 
    </property> 
</bean> 

任何有任何想法的人请给予回复。

+1

资源泄漏? –

+0

雅可能是一个资源泄漏,但它是实际发生相同的代码工作正常弹簧3.0.5升级,但之后去春来3.1.0它显示,如果你知道的东西告诉我这些类型的错误 – Ashish

+0

爵士链接指向? – Ashish

回答

2

这里是你必须解决连接泄漏/池耗尽典型的选项:

  • 提高最大池容量
  • 让你查询运行速度快,从而连接得到返回到池中越早
  • 检查代码在抛出异常时不关闭连接

我将从分析在mysql上运行的查询开始。如果你有MySQL工作台可以使用服务器管理模块,看看有什么疑问正在运行,他们多长时间运行等

如果你的程序确实发出长时间运行queriesbyou需要解决这个问题。另一种可能是你的代码抛出异常(最有可能选中),但不关闭连接之后

我敢肯定有也能分析出什么是一个工具,你最长时间运行的SQL,服务器的吞吐量等

既然你何况春天3.1.X,还要检查the list of JIRA ticket fixed between 3.0.5 to 3.1.0,看看有没有在你的代码可能会影响你的程序

+0

感谢您的答复 – Ashish

+0

爵士爵士,是否有通过它我可以调试在我的连接没有得到背面是连接处泄漏 – Ashish

+0

哪里严格汇集或基本检查,这两个第一子弹不会解决资源的任何方法泄漏,只能缓解一个的影响。同意这篇文章的其余部分,也许会引入一些JMX工具。 –