SQL 错误:0,SQLState:08S01 通信链路故障 [重复]

Posted

技术标签:

【中文标题】SQL 错误:0,SQLState:08S01 通信链路故障 [重复]【英文标题】:SQL Error: 0, SQLState: 08S01 Communications link failure [duplicate] 【发布时间】:2013-05-03 19:45:57 【问题描述】:

我收到此错误(不那么频繁):

2013-05-08 16:44:35,786  WARN (JDBCExceptionReporter.java:100) [org.hibernate.util.JDBCExceptionReporter, logExceptions] - SQL Error: 0, SQLState: 08S01
2013-05-08 16:44:35,786 ERROR (JDBCExceptionReporter.java:101) [org.hibernate.util.JDBCExceptionReporter, logExceptions] - Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
2013-05-08 16:44:35,833 ERROR (AdminDaoImpl.java:297) [com.myapp.admin.db.AdminDaoImpl, createFilePackage] - data-upload: Exception while adding new file package
org.hibernate.exception.JDBCConnectionException: Cannot open connection
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:97) [hibernate-core-3.3.2.GA.jar:3.3.2.GA]
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) [hibernate-core-3.3.2.GA.jar:3.3.2.GA]
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:52) [hibernate-core-3.3.2.GA.jar:3.3.2.GA]
    at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:449) [hibernate-core-3.3.2.GA.jar:3.3.2.GA]
    at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:167) [hibernate-core-3.3.2.GA.jar:3.3.2.GA]
    at org.hibernate.jdbc.JDBCContext.connection(JDBCContext.java:142) [hibernate-core-3.3.2.GA.jar:3.3.2.GA]
    at org.hibernate.transaction.JDBCTransaction.begin(JDBCTransaction.java:85) [hibernate-core-3.3.2.GA.jar:3.3.2.GA]
    at org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1354) [hibernate-core-3.3.2.GA.jar:3.3.2.GA]
    at com.myapp.admin.db.AdminDaoImpl. createFilePackage(AdminDaoImpl.java:182) [AdminDaoImpl.class:na]
    at com.myapp.admin.ctrl.UploadController.processUploadZip(UploadController.java:217) [UploadController.class:na]
    at sun.reflect.GeneratedMethodAccessor106.invoke(Unknown Source) [na:na]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) [na:1.6.0_35]
    at java.lang.reflect.Method.invoke(Method.java:597) [na:1.6.0_35]
    at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:212) [spring-web-3.1.0.RELEASE.jar:3.1.0.RELEASE]
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:126) [spring-web-3.1.0.RELEASE.jar:3.1.0.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:96) [spring-webmvc-3.1.0.RELEASE.jar:3.1.0.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:617) [spring-webmvc-3.1.0.RELEASE.jar:3.1.0.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:578) [spring-webmvc-3.1.0.RELEASE.jar:3.1.0.RELEASE]
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80) [spring-webmvc-3.1.0.RELEASE.jar:3.1.0.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:900) [spring-webmvc-3.1.0.RELEASE.jar:3.1.0.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:827) [spring-webmvc-3.1.0.RELEASE.jar:3.1.0.RELEASE]
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882) [spring-webmvc-3.1.0.RELEASE.jar:3.1.0.RELEASE]
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789) [spring-webmvc-3.1.0.RELEASE.jar:3.1.0.RELEASE]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:647) [servlet-api.jar:na]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728) [servlet-api.jar:na]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) [catalina.jar:7.0.35]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) [catalina.jar:7.0.35]
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) [catalina.jar:7.0.35]
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) [catalina.jar:7.0.35]
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) [catalina.jar:7.0.35]
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) [catalina.jar:7.0.35]
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) [catalina.jar:7.0.35]
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) [catalina.jar:7.0.35]
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) [catalina.jar:7.0.35]
    at org.apache.coyote.ajp.AjpProcessor.process(AjpProcessor.java:200) [tomcat-coyote.jar:7.0.35]
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) [tomcat-coyote.jar:7.0.35]
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310) [tomcat-coyote.jar:7.0.35]
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) [na:1.6.0_35]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) [na:1.6.0_35]
    at java.lang.Thread.run(Thread.java:662) [na:1.6.0_35]
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

我有两个 Web(spring mvc + hibernate + mysql)应用程序托管在共享服务器上:

1) 显示文件下载的主应用程序(通过管理应用程序插入)

2) 具有 CRUD 操作的管理应用程序

此错误有时会出现,当我使用“管理员”应用程序为“主”应用程序上传文件时,可以说可能是在成功上传/处理大约 100-120 个文件/请求并且每个请求使用 10- 20 个插入/更新查询。

托管详情:

Private tomcat hosting
java 1.6.0_35-b10
tomcat 7.0.35
heap size 288MB
MySQL Server 5
commons-dbcp 1.2.2
mysql-connector-java 5.1.9

数据库 + Hibernate + DBCP 属性:

<bean id="dbDataSource" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="username" value="test" />
    <property name="password" value="test" />
    <property name="url" value="jdbc:mysql://localhost/my_database?useUnicode=yes&characterEncoding=UTF-8" />

    <!-- DBCP Connection Pool Settings -->
    <property name="defaultAutoCommit" value="true" />
    <property name="initialSize" value="10" />
    <property name="maxActive" value="500" />
    <property name="maxIdle" value="8" />
    <property name="minIdle" value="0" />
    <property name="maxWait" value="30000" />
    <property name="validationQuery" value="SELECT 1" />
    <property name="testOnBorrow" value="true" />
    <property name="testOnReturn" value="false" />
    <property name="testWhileIdle" value="false" />
    <property name="timeBetweenEvictionRunsMillis" value="-1" />
    <property name="numTestsPerEvictionRun" value="3" />
    <property name="minEvictableIdleTimeMillis" value="180000" />
    <property name="poolPreparedStatements" value="true" />
    <property name="maxOpenPreparedStatements" value="25" />
    <property name="accessToUnderlyingConnectionAllowed" value="false" />
    <property name="removeAbandoned" value="false" />
    <property name="removeAbandonedTimeout" value="300" />
    <property name="logAbandoned" value="false" />
</bean>

hibernate.dialect=org.hibernate.dialect.MySQLDialect
hibernate.hbm2ddl.auto=none
hibernate.jdbc.batch_size=100
hibernate.show_sql=false
hibernate.format_sql=false
hibernate.cache.use_second_level_cache=true
hibernate.cache.use_query_cache=false
hibernate.cache.provider_class=org.hibernate.cache.NoCacheProvider
hibernate.current_session_context_class=thread

相关代码:

public String createFilePackage(FilePackage package) 
    String message = "";

    Session session = getSessionFactory().openSession();
    Transaction tx = null;
    try 
        tx = session.beginTransaction();

        // handling package, around 10-14 DB insert, 10 SELECT and 5 update queries on same session

        tx.commit();

     catch(Exception e) 
        logger.error("file-upload: Exception while adding new font package", e);
        if(tx != null)  tx.rollback(); 
     finally 
        session.close();
    
    return message;

任何建议如何解决这个问题?

【问题讨论】:

查看mysql日志。看看其中是否有解释连接意外断开的原因。 可能是事务超时? 【参考方案1】:

驱动程序与驱动程序尝试连接的数据源之间的通信链接在函数完成处理之前失败。 所以通常是网络错误。这可能是由于数据包丢失或防火墙/交换机配置不当造成的。

【讨论】:

我遇到了问题中描述的类似问题。我同意 Marciej 的回答。在企业网络上,我的本地开发机器正在断开与数据库服务器的连接,但是位于不同防火墙集后面的部署环境服务器能够连接到同一个数据库并保持其连接没有问题。我的本地开发机器会在设置后 2 分钟内断开连接。我还发现,通过我们的无线网络运行可以保持连接,而有线则没有(并且两者都通过不同的路由/防火墙运行)。 当套接字超时小于查询时间时,长时间运行的查询也会发生这种情况。 jdbc:mariadb:aurora://myHost/db?socketTimeout=0 可用于设置socketTimeout值。【参考方案2】:

检查您的服务器配置文件/etc/mysql/my.cnf - 确认bind_address 未设置为127.0.0.1。将其设置为0.0.0.0 或将其注释掉然后重启服务器:

sudo service mysql restart

【讨论】:

我在我的 Mac 中找不到 /etc/mysql 文件夹。我需要为 Mac 搜索任何其他文件吗? 谢谢,这是我的问题。 我有同样的错误,但我没有在配置文件中找到 bind_address。这可能是错误的原因?【参考方案3】:

我正在回答这个错误代码(08s01)的具体问题。

通常,MySql 关闭套接字连接是在 MySQL 服务器端定义的 wait_timeout 的某个时间间隔,默认为 8 小时。因此,如果在此时间之后连接超时,并且套接字将抛出 SQLState 为“08s01”的异常。

1.使用连接池执行Query,确保池类有在超时前检查连接成员的功能。

2.给的值大于默认值,但最大值为24天

3.在连接 URL 中使用另一个参数,但不推荐使用此方法,并且可能已弃用。

【讨论】:

这似乎很有用....您能详细解释一下这些步骤吗....我如何提供检查功能以及 wait_timeout 的工作原理。【参考方案4】:

可能是由于 TCP 协议关闭。

如何检查/启用: https://dba.stackexchange.com/questions/11377/cannot-connect-to-ms-sql-2008-r2-by-dbvisualizer-native-sspi-library-not-loade/144097#144097

【讨论】:

以上是关于SQL 错误:0,SQLState:08S01 通信链路故障 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Ambari 2.7.3.0-139:SQLException:SQL 状态:08S01 com.mysql.jdbc.exceptions.jdbc4.CommunicationsException

奇怪的SQL Error: 0,SQLState: S0022错误

休眠 SQL 错误:17002,SQLState:空 Io 异常:连接重置

连接失败:SQLState:'01000' SQL Server 错误:53

Laravel 5.8 SQLSTATE [42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误

SQL 查询的准备语句,错误 DB2 SQL 错误:SQLCODE=-206,SQLSTATE=42703