MySQL wait_timeout参数设置与网上常见错误小纠

原创 2013年12月02日 18:27:13

应用遇到异常报警:

Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet successfully received from the server was 23,579 milliseconds ago.  The last packet sent successfully to the server was 0 milliseconds ago.
        at sun.reflect.GeneratedConstructorAccessor40.newInstance(Unknown Source)
        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:409)
        at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1118)
        at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3055)
        at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2941)
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3489)
        at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1959)
        at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2113)
        at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2568)
        at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2113)
        at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:1364)
        at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.execute(NewProxyPreparedStatement.java:989)
        at com.ibatis.sqlmap.engine.execution.SqlExecutor.executeQuery(SqlExecutor.java:185)
        at com.ibatis.sqlmap.engine.mapping.statement.MappedStatement.sqlExecuteQuery(MappedStatement.java:221)
        at com.ibatis.sqlmap.engine.mapping.statement.MappedStatement.executeQueryWithCallback(MappedStatement.java:189)
        ... 36 more
Caused by: java.io.EOFException: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.
        at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:2502)
        at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2952)
        ... 47 more


问题比较明显,应用连接已经失效。

23.579s之前创建了一个连接,之后再次使用此数据库连接就超时了。


查看数据库配置:

mysql> show  global  variables like  'wait_timeout';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout  | 20    |
+---------------+-------+
1 row in set (0.00 sec)

服务器设置的时间为20s.从而说明上面超时的原因。


解决这个方法:


一:从应用层解决问题:修改连接池参数  缩短连接池内的连接超时时间。


二:从DB层解决问题:增大MySQL的连接失效时间。

mysql> show  global  variables like  'wait_timeout';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout  | 20    |
+---------------+-------+
1 row in set (0.00 sec)


动态修改global参数,wait_timeout;

set global wait_timeout=30;


再次查看参数:

mysql> show  global  variables like  'wait_timeout';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout  | 30    |
+---------------+-------+
1 row in set (0.00 sec)

设置完毕。


时间的大小设置不能随便,时间过长,导致过多的connection Sleep,占用较多系统资源。时间设置过小也不行。从业务出发,结合查询的耗时与业务吞吐量来进行设置比较合适吧。





常见误解:


网上有很多文章 没有清晰的认识 会话变量与全局变量的不同,查看了会话变量的超时时间,最终可能会导致将全局变量 wait_timeout设置成了31536000s!!


[mysqld]

wait_timeout=31536000


my.cnf里设置的参数是global级别。不是会话级别。


然而:

mysql> show variables like  'wait_timeout';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout  | 28800 |
+---------------+-------+
1 row in set (0.00 sec)

是会话级别。有些人会把会话参数误认为全局参数。


正确的参数初始化设置应该为:

[mysqld]

wait_timeout=30 




建议大家今后查询变量的时候不要使用缺省。

查询会话变量:

mysql> show session variables like  '%wait%'; 
+--------------------------+----------+
| Variable_name            | Value    |
+--------------------------+----------+
| innodb_lock_wait_timeout | 50       |
| innodb_spin_wait_delay   | 6        |
| lock_wait_timeout        | 31536000 |
| wait_timeout             | 28800    |
+--------------------------+----------+
4 rows in set (0.00 sec)


查询全局变量:

mysql> show global variables like  '%wait%';        
+--------------------------+----------+
| Variable_name            | Value    |
+--------------------------+----------+
| innodb_lock_wait_timeout | 50       |
| innodb_spin_wait_delay   | 6        |
| lock_wait_timeout        | 31536000 |
| wait_timeout             | 30       |
+--------------------------+----------+
4 rows in set (0.00 sec)


版权声明:本文为博主原创文章,未经博主允许不得转载。

mysql Can not read response from server. Expected to read 4 bytes 异常

http://stackoverflow.com/questions/13950496/what-is-java-io-eofexception-message-can-not-read-respon...
  • u013603157
  • u013603157
  • 2014年04月29日 21:49
  • 8012

数据库报错

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure Last packet sen...
  • zhuizhu_xingfu
  • zhuizhu_xingfu
  • 2014年06月27日 17:01
  • 2203

web服务连接mysql报错 解析:Can not read response from server. Expected to read 4 bytes, read 0 bytes before c

报错内容: The last packet successfully received from the server was 3,087,649 milliseconds ago.  The la...
  • xiaobai001gonsoni
  • xiaobai001gonsoni
  • 2016年12月23日 17:48
  • 3041

tomcat链接mysql时超时报错java.io.EOFException: Can not read response from server. Expected to read 4 bytes,

需要在配置文件里加上下面就ok了
  • zhq426
  • zhq426
  • 2013年08月06日 10:06
  • 11401

Caused by: java.io.EOFException: Can not read response from server.

1、错误描述The last packet successfully received from the server was 76,997 milliseconds ago. The last p...
  • you23hai45
  • you23hai45
  • 2015年11月05日 23:19
  • 4665

Mysql空闲连接超时自动断开问题记录

Mysql数据库空闲连接默认8小时后会自动断开连接,此时由于业务处理使用C3P0连接池,业务在一个长时间休眠恢复后(其实是一个每天的定时任务)出现mysql 读写socket异常。异常栈信息如下:co...
  • saroll57
  • saroll57
  • 2017年03月02日 14:10
  • 567

supervisor无法正常运行Caused by: java.io.EOFException: null

告警发现一个supervisor停止,重启启动服务,但无法正常运行,查看日志报错如下: 2015-09-27 10:21:53 c.n.c.f.i.CuratorFrameworkImpl [INF...
  • levy_cui
  • levy_cui
  • 2016年04月13日 14:25
  • 1311

MySQL查看和修改wait_timeout

1、全局查看wait_timeout值 [plain] view plaincopyprint? mysql> show global variab...
  • nthack5730
  • nthack5730
  • 2015年11月25日 22:04
  • 18071

mysql经典的8小时问题-wait_timeout

前段时间 现网突然频繁报出 连接不上数据库,偶滴的妖孽,其他地方都是用mysql,也没遇到这个问题呀。 java.io.EOFExceptionat at com.mysql.jdbc.Mysql...
  • a137268431
  • a137268431
  • 2017年12月08日 15:59
  • 115

MySQL里的set global wait_timeout

如果你没有修改过MySQL的配置,缺省情况下,wait_timeout的初始值是28800。 wait_timeout过大有弊端,其体现就是MySQL里大量的SLEEP进程无法及时释放,拖累系统...
  • wulantian
  • wulantian
  • 2014年03月18日 15:16
  • 12584
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MySQL wait_timeout参数设置与网上常见错误小纠
举报原因:
原因补充:

(最多只允许输入30个字)