2012-05-18 127 views
0

當Web服務被訪問時,我會隨機得到這個錯誤。它很難複製,並且一旦我刷新它,所有功能都按預期工作。jdbc開始失敗

 

    Caused by: org.hibernate.exception.JDBCConnectionException: could not execute query 
     at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:97) 
     at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) 
     at org.hibernate.loader.Loader.doList(Loader.java:2235) 
     at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2129) 
     at org.hibernate.loader.Loader.list(Loader.java:2124) 
     at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:118) 
     at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1597) 
     at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:306) 
     at edu.asd.myproj.hibernate.adapter.CriteriaAdapter.list(CriteriaAdapter.java:380) 
     at edu.asd.myproj.DaoHibernateImpl.findByCriteria(DaoHibernateImpl.java:778) 
     at edu.asd.myproj.DaoHibernateImpl.findByCriteria(DaoHibernateImpl.java:765) 
     at edu.asd.myproj.DaoHibernateImpl.findByProperty(DaoHibernateImpl.java:361) 
     at edu.asd.myproj.ProfilesDaoImpl.count(ProfilesDaoImpl.java:81) 
     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 org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:307) 
     at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182) 
     at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149) 
     at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106) 
     at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) 
     at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204) 
     at $Proxy27.count(Unknown Source) 
     at edu.asd.myproj.ResourceProfileLoaderNew.loadProfiles(ResourceProfileLoaderNew.java:66) 
     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 org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleElement.invoke(InitDestroyAnnotationBeanPostProcessor.java:297) 
     at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata.invokeInitMethods(InitDestroyAnnotationBeanPostProcessor.java:250) 
     at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:144) 
     ... 50 more 
    Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was44323 seconds ago.The last packet sent successfully to the server was 44323 seconds ago, which is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem. 
     at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
     at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) 
     at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) 
     at java.lang.reflect.Constructor.newInstance(Constructor.java:513) 
     at com.mysql.jdbc.Util.handleNewInstance(Util.java:406) 
     at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1074) 
     at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3246) 
     at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1917) 
     at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2060) 
     at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2542) 
     at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1734) 
     at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1885) 
     at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:93) 
     at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:208) 
     at org.hibernate.loader.Loader.getResultSet(Loader.java:1812) 
     at org.hibernate.loader.Loader.doQuery(Loader.java:697) 
     at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259) 
     at org.hibernate.loader.Loader.doList(Loader.java:2232) 
     ... 79 more 
    Caused by: java.net.SocketException: Broken pipe 
     at java.net.SocketOutputStream.socketWrite0(Native Method) 
     at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92) 
     at java.net.SocketOutputStream.write(SocketOutputStream.java:136) 
     at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:65) 
     at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:123) 
     at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3227) 
     ... 90 more 

這是我的hibernate.properties文件

# Turn on for SQL debugging 
hibernate.show_sql=true 

# Generate schema? 
hibernate.hbm2ddl.auto=validate 

#============================================================ 
# C3P0 connection pool configuration 
#============================================================ 
#changed to default values 
c3p0.acquireIncrement=hibernate.c3p0.acquire_increment 
c3p0.idleConnectionTestPeriod=hibernate.c3p0.idle_test_period 
c3p0.initialPoolSize=10 
c3p0.maxIdleTime=hibernate.c3p0.timeout 
c3p0.maxPoolSize=hibernate.c3p0.max_size 
c3p0.maxStatements=hibernate.c3p0.max_statements 
c3p0.minPoolSize=hibernate.c3p0.min_size 
c3p0.testConnectionsOnCheckout=hibernate.c3p0.validate 

被視爲錯誤隨機一次,它需要很長的時間它reappears.It消失一次刷新之前。

回答

4

請發送完整的異常堆棧跟蹤,以便更多地瞭解讀者。

這種異常通常發生在DB Connection陳舊時。

陳舊意味着:連接被服務器終止,但仍被池認爲是活着的。您需要在連接中配置連接測試。對於C3P0這種方法,你必須使用以下配置:

c3p0.testConnectionOnCheckin = true 
testConnectionOnCheckout= true 

和檢查更多增加結帳超時如下:

c3p0.checkoutTimeout = 0 

並測試C3P0另一個測試選項,如:

  • connectionTesterClassName
  • idleConnectionTestPeriod
  • automaticTestTable
  • preferredTestQuery

用於測試的另一種方法是通過一個JDBC pure

+0

即使添加c3p0.testConnectionOnCheckin =真後寫示例代碼和連接到數據庫。(由DriverManagerConnection和等)我得到了同樣的錯誤。我還向數據庫URL添加了autoReconnect?= true,但仍然是相同的錯誤。 – icedek

+1

對不起延遲迴復您的評論並感謝追加異常堆棧跟蹤。當'java.net.SocketException:Broken pipe'異常發生時,其原因可能是'Database'方面,請更改數據庫提供者,例如使用'MySql'或'Derby'或其他方法進行測試。 – MJM