0

访问 Web 服务时我随机收到此错误。很难复制,一旦我刷新它,一切都按预期运行。

  

    引起:org.hibernate.exception.JDBCConnectionException:无法执行查询
        在 org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:97)
        在 org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
        在 org.hibernate.loader.Loader.doList(Loader.java:2235)
        在 org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2129)
        在 org.hibernate.loader.Loader.list(Loader.java:2124)
        在 org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:118)
        在 org.hibernate.impl.SessionImpl.list(SessionImpl.java:1597)
        在 org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:306)
        在 edu.asd.myproj.hibernate.adapter.CriteriaAdapter.list(CriteriaAdapter.java:380)
        在 edu.asd.myproj.DaoHibernateImpl.findByCriteria(DaoHibernateImpl.java:778)
        在 edu.asd.myproj.DaoHibernateImpl.findByCriteria(DaoHibernateImpl.java:765)
        在 edu.asd.myproj.DaoHibernateImpl.findByProperty(DaoHibernateImpl.java:361)
        在 edu.asd.myproj.ProfilesDaoImpl.count(ProfilesDaoImpl.java:81)
        在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        在 java.lang.reflect.Method.invoke(Method.java:597)
        在 org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:307)
        在 org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182)
        在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149)
        在 org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106)
        在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
        在 org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
        在 $Proxy27.count(未知来源)
        在 edu.asd.myproj.ResourceProfileLoaderNew.loadProfiles(ResourceProfileLoaderNew.java:66)
        在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        在 java.lang.reflect.Method.invoke(Method.java:597)
        在 org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleElement.invoke(InitDestroyAnnotationBeanPostProcessor.java:297)
        在 org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata.invokeInitMethods(InitDestroyAnnotationBeanPostProcessor.java:250)
        在 org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:144)
        ... 50 更多
    原因:com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:从服务器成功接收的最后一个数据包是44323秒前。最后一个成功发送到服务器的数据包是44323秒前,比服务器配置的值长'等待超时”。您应该考虑在应用程序中使用之前使连接有效性过期和/或测试,增加客户端超时的服务器配置值,或使用连接器/J 连接属性“autoReconnect=true”来避免此问题。
        在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        在 sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
        在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
        在 java.lang.reflect.Constructor.newInstance(Constructor.java:513)
        在 com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
        在 com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1074)
        在 com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3246)
        在 com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1917)
        在 com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2060)
        在 com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2542)
        在 com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1734)
        在 com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1885)
        在 org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:93)
        在 org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:208)
        在 org.hibernate.loader.Loader.getResultSet(Loader.java:1812)
        在 org.hibernate.loader.Loader.doQuery(Loader.java:697)
        在 org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259)
        在 org.hibernate.loader.Loader.doList(Loader.java:2232)
        ... 79 更多
    引起:java.net.SocketException: Broken pipe
        在 java.net.SocketOutputStream.socketWrite0(本机方法)
        在 java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
        在 java.net.SocketOutputStream.write(SocketOutputStream.java:136)
        在 java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:65)
        在 java.io.BufferedOutputStream.flush(BufferedOutputStream.java:123)
        在 com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3227)
        ... 90 更多

这是我的 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

该错误随机出现一次,需要很长时间才能再次出现。刷新后消失。

4

1 回答 1

4

请发送完整的异常堆栈跟踪,以便读者进一步了解。

此异常通常在DB Connection陈旧时发生。

陈旧意味着:连接被服务器杀死,但仍然被池认为是活动的。您需要在连接中配置连接测试。对于这种方法,C3P0您必须使用以下配置:

c3p0.testConnectionOnCheckin = true
testConnectionOnCheckout= true

和更多检查增加结帐超时如下:

c3p0.checkoutTimeout = 0

并测试另一个测试选项,C3P0例如:

  • connectionTesterClassName
  • idleConnectionTestPeriod
  • automaticTestTable
  • preferredTestQuery

另一种测试方法是编写示例代码并通过代码连接到数据库JDBC pure。(通过DriverManagerConnection等)

于 2012-05-19T13:39:09.577 回答