Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java com.mysql.jdbc.exceptions.jdbc4.CommunicationsException mysql+ApacheTomcat 7_Java_Mysql_Spring_Jdbc_Connection Pooling - Fatal编程技术网

Java com.mysql.jdbc.exceptions.jdbc4.CommunicationsException mysql+ApacheTomcat 7

Java com.mysql.jdbc.exceptions.jdbc4.CommunicationsException mysql+ApacheTomcat 7,java,mysql,spring,jdbc,connection-pooling,Java,Mysql,Spring,Jdbc,Connection Pooling,我的应用程序Spring4MVC/Hibernate4/MySQL/Maven使用基于注释的配置将Spring与Hibernate集成。在几个小时不使用数据库后,我总是看到以下错误: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 84,510,841 milliseconds ago. The last pack

我的应用程序Spring4MVC/Hibernate4/MySQL/Maven使用基于注释的配置将Spring与Hibernate集成。在几个小时不使用数据库后,我总是看到以下错误:

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 84,510,841 milliseconds ago.  The last packet sent successfully to the server was 84,510,841 milliseconds ago. 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.
    sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    java.lang.reflect.Constructor.newInstance(Constructor.java:526)
    com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
    com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1121)
    com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3938)
    com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2551)
    com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2731)
    com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2809)
    com.mysql.jdbc.ConnectionImpl.setAutoCommit(ConnectionImpl.java:5333)
    sun.reflect.GeneratedMethodAccessor58.invoke(Unknown Source)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    java.lang.reflect.Method.invoke(Method.java:606)
    org.apache.tomcat.jdbc.pool.ProxyConnection.invoke(ProxyConnection.java:126)
    org.apache.tomcat.jdbc.pool.JdbcInterceptor.invoke(JdbcInterceptor.java:109)
    org.apache.tomcat.jdbc.pool.DisposableConnectionFacade.invoke(DisposableConnectionFacade.java:80)
    com.sun.proxy.$Proxy33.setAutoCommit(Unknown Source)
    org.hibernate.resource.jdbc.internal.AbstractLogicalConnectionImplementor.begin(AbstractLogicalConnectionImplementor.java:67)
    org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.begin(LogicalConnectionManagedImpl.java:238)
    org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.begin(JdbcResourceLocalTransactionCoordinatorImpl.java:213)
    org.hibernate.engine.transaction.internal.TransactionImpl.begin(TransactionImpl.java:52)
    org.hibernate.internal.SessionImpl.beginTransaction(SessionImpl.java:1512)
    org.hibernate.jpa.internal.TransactionImpl.begin(TransactionImpl.java:45)
    org.springframework.orm.jpa.vendor.HibernateJpaDialect.beginTransaction(HibernateJpaDialect.java:170)
    org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:380)
    org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:373)
    org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:427)
    org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:276)
    org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:208)
    com.sun.proxy.$Proxy118.findAll(Unknown Source)
    com.ideefe.iot.controller.AppController.listDevices(AppController.java:49)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    java.lang.reflect.Method.invoke(Method.java:606)
    org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:222)
    org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137)
    org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110)
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:814)
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:737)
    org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:620)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
    org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:121)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    org.springframework.web.multipart.support.MultipartFilter.doFilterInternal(MultipartFilter.java:118)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
以下是MySQL my.cnf文件:

我使用的连接池定义如下:

<?xml version="1.0" encoding="UTF-8"?> 
<Context>
    <!-- Especifica un DataSource JDBC. --> 
    <Resource name="jdbc/devicesDS"
              auth="Container"
              type="javax.sql.DataSource"
              maxActive="10"
              maxIdle="4"
              username="root"
              password="SrbBfsatn640^"
              driverClassName="com.mysql.jdbc.Driver"
              url="jdbc:mysql://localhost:3306/devices?autoReconnect=true"
              validationQuery="select 1 from dual" />
</Context>  
看起来这是-有很多类似的StackOverflow问题围绕着它,例如,和。建议通过添加testOnBorrow=true来更改连接池设置,即:


我个人倾向于testOnBorrow而不是testWhileIdle,因为前者完全独立于值,但不确定性能如何比较。在JDBC URL中使用autoreconnect=true的替代方法时也要谨慎:不建议使用,因为当应用程序不能正确处理SQLExceptions时,它会产生与会话状态和数据一致性相关的副作用,仅当您无法将应用程序配置为正确处理死机和过时连接导致的SQLException时,才可使用它。

在您的应用程序中,数据库mysql的连接字符串应为:

jdbc:mysql://{host}:{port}/{schema}?autoReconnect=true

添加autoReconnect=true将解决此问题

在尝试了每个配置、autoReconnect等之后,我在其他应用程序实现中遇到了此问题。 我发现解决这个问题的唯一方法是每小时生成一个调度事件调用一个测试查询来ping数据库,强制它刷新连接

query("SELECT version()");

您正在使用连接池吗?如果是,哪一个?在日志中所说的问题,您应该考虑在应用程序使用之前对连接有效性进行期满和/或测试,增加客户端超时的服务器配置值,或者使用连接器/J连接属性“AutoReNeNeCT= true”来避免此问题,只需使用SELECT 1作为ValueQualQu疑问。如果从dual中写入select 1,则dual表中的每一行都将为每个验证查询返回。
jdbc:mysql://{host}:{port}/{schema}?autoReconnect=true
query("SELECT version()");