2013-07-04 133 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工具。 –