最近做的网站使用的是MYSQL数据库 发现果超过8小时应用程序不去访问数据库,数据库就断掉连接 。这时再次访问就会抛出异常,如下所示:
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure Last packet sent to the server was 0 ms ago. at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:525) at com.mysql.jdbc.Util.handleNewInstance(Util.java:406) at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1074) at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2120) at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:723) at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:46) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:525) at com.mysql.jdbc.Util.handleNewInstance(Util.java:406) at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:302) at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:282) at java.sql.DriverManager.getConnection(DriverManager.java:579) at java.sql.DriverManager.getConnection(DriverManager.java:243) at mysql.DBUtil.ConnectAccess(DBUtil.java:29) at mysql.DBUtil.getConn(DBUtil.java:15) at obj.IndexTurnPic.getAll(IndexTurnPic.java:49) at action.GetTurnPic.doAction(GetTurnPic.java:17) at maincontrol.MainControlServlet.service(MainControlServlet.java:34) at javax.servlet.http.HttpServlet.service(HttpServlet.java:728) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) at org.apache.coyote.ajp.AjpProcessor.process(AjpProcessor.java:200) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:722) Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
查了一下发现应用程序和mysql数据库建立连接,如果超过8小时应用程序不去访问数据库,数据库就断掉连接 。这时再次访问就会抛出异常。
关于mysql自动断开的问题研究结果如下,在mysql中有相关参数设定,当数据库连接空闲一定时间后,服务器就会断开等待超时的连接:
1、相关参数,红色部分
mysql> show variables like '%timeout%';
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| connect_timeout | 5 |
| delayed_insert_timeout | 300 |
| innodb_lock_wait_timeout | 50 |
| interactive_timeout | 28800 |
| net_read_timeout | 30 |
| net_write_timeout | 60 |
| slave_net_timeout | 3600 |
| wait_timeout | 28800 |
+--------------------------+-------+
同一时间,这两个参数只有一个起作用。到底是哪个参数起作用,和用户连接时指定的连接参数相关,缺省情况下是使用wait_timeout。我建议是将这两个参数都修改,以免引起不必要的麻烦。
2、修改参数
这两个参数的默认值是8小时(60*60*8=28800)。我测试过将这两个参数改为0,结果出人意料,系统自动将这个值设置为1。换句话说,不能将该值设置为永久。
将这2个参数设置为一年(31536000)即可。
set interactive_timeout=31536000;
set wait_timeout=31536000;
也可以修改my.cof,修改后重起mysql
打开/etc/my.cnf,在属性组mysqld下面添加参数如下:
[mysqld]
interactive_timeout=31536000
wait_timeout=31536000
如果一段时间内没有数据库访问则mysql自身将切断连接,之后访问java访问连接池时对数据库的数据通道早就关闭了,因为dbcp连接池无法时时维护与数据库的连接关系,mysql5以后即使在dbcp配置中加入autoReconnect=true也没有效果。
---------------------更新----- 以上方法实际操作不可用---
如果你没有修改过MySQL的配置,缺省情况下,wait_timeout的初始值是28800。
wait_timeout过大有弊端,其体现就是MySQL里大量的SLEEP进程无法及时释放,拖累系统性能,不过也不能把这个指设置的过小,否则你可能会遭遇到“MySQL has gone away”之类的问题,通常来说,我觉得把wait_timeout设置为10是个不错的选择,但某些情况下可能也会出问题,比如说有一个CRON脚本,其中两次SQL查询的间隔时间大于10秒的话,那么这个设置就有问题了(当然,这也不是不能解决的问题,你可以在程序里时不时mysql_ping一下,以便服务器知道你还活着,重新计算wait_timeout时间):
# vi /etc/my.cnf
[mysqld]
wait_timeout=10
# /etc/init.d/mysql restart
不过这个方法太生硬了,线上服务重启无论如何都应该尽可能避免,看看如何在MySQL命令行里通过SET来设置:
mysql> set global wait_timeout=10;
mysql> show global variables like 'wait_timeout';
+----------------------------+-------+
| Variable_name | Value |
+----------------------------+-------+
| wait_timeout | 10 |
+----------------------------+-------+
这里一个容易把人搞蒙的地方是如果查询时使用的是show variables的话,会发现设置好像并没有生效,这是因为单纯使用show variables的话就等同于使用的是show session variables,查询的是会话变量,只有使用show global variables,查询的才是全局变量。
网络上很多人都抱怨说他们set global之后使用show variables查询没有发现改变,原因就在于混淆了会话变量和全局变量,如果仅仅想修改会话变量的话,可以使用类似set wait_timeout=10;或者set session wait_timeout=10;这样的语法。
另一个值得注意的是会话变量wait_timeout初始化的问题,这一点在手册里已经明确指出了,我就直接拷贝了:
On thread startup, the session wait_timeout value is initialized from the global wait_timeout value or from the global interactive_timeout value, depending on the type of client (as defined by the CLIENT_INTERACTIVE connect option to mysql_real_connect()).
MySQL大拿Jeremy Zawodny曾在他的文章Fixing Poor MySQL Default Configuration Values里面列出了几个很恶心的MySQL缺省设置,不过没包含wait_timeout,但我觉得它也应该算一个,每次新装MySQL后最好都记得修改它。
相关推荐
正常情况下,客户端应在建立连接后的10秒内发送账号、驱动版本和操作系统信息,但在异常情况下,这部分信息的发送被延迟,导致数据库服务器认为连接超时并发送Finish包终止连接。 3. **代码层面分析** - 在...
在这个案例中,C3P0连接池中的某些连接由于长时间空闲而被MySQL服务器断开,但是C3P0连接池并不知道这些连接已经失效,当客户端再次请求这些连接时,就产生了`CommunicationsException`异常。 #### 解决方案 根据...
在服务器运维过程中,遇到MySQL数据库服务占用率高达99%的情况时,这通常意味着数据库服务正在面临严重的问题,可能导致整个系统的响应时间增加,甚至出现服务不可用的情况。本篇文章将基于给定的案例,详细探讨这一...
记得在完成数据库操作后关闭连接,以释放系统资源: ```csharp connection.Close(); ``` 7. **使用ORM框架**: 除了直接使用ADO.NET,还可以借助ORM(对象关系映射)框架,如Entity Framework,简化数据库...
考虑到修改 DataX 源码的难度和复杂性,本次采取了一种更为简单的解决方案:通过调整 Hive 中的参数配置来间接解决问题。具体来说,减小 `hive.merge.smallfiles.avgsize` 的值,使生成的文件块大小均不超过 256M。 ...
4. **超时设置**:检查MySQL的`wait_timeout`和`interactive_timeout`配置,这两个参数控制了客户端无活动后断开连接的时间,如果设置得过短,也可能导致连接错误。 5. **服务器资源限制**:如果服务器资源紧张,如...
1. 性能优越:MySQL 数据库具有高性能和稳定性,可以轻松处理大量的并发用户连接和高并发的请求,且很少出现异常宕机的情况。 2. 兼容性强:MySQL 数据库具有高度兼容性,支持多种操作系统、多种 API 接口和多种开发...
若一段时间后仍未解决问题,则需尝试第二种方案。 #### 第二种解决方案:彻底清理环境 1. **卸载可能导致冲突的软件:** - 卸载可能导致Eclipse运行不稳定的应用程序,如MAYA、MAX、Apple相关软件、WAMP、MySQL等...
### MySQL实体类编译错误1751解析与解决方案 #### 背景介绍 在进行MySQL数据库开发的过程中,有时会遇到实体类编译时出现错误1751的情况,表现为“错误 175:指定的存储区提供程序在配置中找不到,或者无效”。...
总的来说,微服务架构的分布式事务解决方案是一门深奥的学问,涉及到服务之间的协调、异常处理、回滚策略等多个方面。通过“微服务架构的分布式事务解决方案.txt”这份文档,读者可以深入理解这一领域的核心概念和...
- **目的**:提供在没有完整 C99 支持的系统上构建 MySQL++ 的解决方案。 - **代码**:例如,使用预处理器指令替代 C99 功能。 #### 九、结论 MySQL++ 是一个强大的工具,它不仅简化了 C++ 应用程序与 MySQL 数据库...
在Oracle数据库中,序列是一种非常重要的工具,它用于生成唯一的整数序列,通常用作主键。...请注意,这种方法可能不如Oracle的序列功能那么高效,但在没有内置序列功能的MySQL中,这是一种可行的解决方案。
在这个特定的案例中,我们看到几个关键的错误信息和解决方案,主要集中在C#编程语言中与MySQL数据库交互的问题。 首先,错误信息指出"Authentication 出错",这通常意味着在尝试连接到MySQL服务器时,用户名、密码...
- **错误日志**:当出现异常情况时,如无法找到必要的类库、无法连接数据库或连接池已满等问题,会记录相关的错误信息。 ### 范例 #### 应用程序示例 为了更好地理解如何使用Snap-ConnectionPool,下面给出一个...
当数据库出现异常关闭或者错误时,可能会影响到这个文件,进而影响到数据库的正常运行。 mysql数据库修复专家4.0版针对这些文件类型提供了专门的修复方案,包括但不限于以下几点: 1. **错误诊断**:工具首先会对...
### TCC 分布式事务解决方案详解 #### 一、什么是TCC事务? TCC事务是一种分布式事务处理模型,尤其适用于微服务架构中的场景。TCC是Try、Confirm、Cancel三个单词首字母的缩写,代表着分布式事务处理过程中的三个...
- **MHA多从库选主机制**:MHA是一种成熟的MySQL高可用解决方案,通过监控多个备库的状态,并在主库故障时自动选出一个新的主库,从而实现无缝切换。 #### TMHA如何实现异常切换 TMHA通过以下步骤实现异常切换: ...
MySQL Server has gone away 是一个常见的错误提示,通常出现在MySQL服务器与客户端应用之间的连接中断时。这个错误可能由多种原因引起,包括超时、数据包过大或资源耗尽等。下面我们将详细探讨这些原因以及相应的...
在这种情况下,可以尝试添加一个重试机制,如果遇到错误,等待一段时间后再次执行命令。 5. **更新或替换MySQL客户端库**:正如标签中提到的“k12”可能是指教育领域,这可能是一个教学环境。如果问题是由旧版本...