我的日常

登录/注册
您现在的位置:论坛 资料库 数据库开发 > MySQL wait_timeout参数设置与网上常见错误小纠
总共48087条微博

动态微博

查看: 1974|回复: 0

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

[复制链接]
admin    

1244

主题

544

听众

1万

金钱

管理员

  • TA的每日心情

    2021-2-2 11:21
  • 签到天数: 36 天

    [LV.5]常住居民I

    管理员

    跳转到指定楼层
    楼主
    发表于 2015-08-27 10:48:54 |只看该作者 |倒序浏览
    应用遇到异常报警:
    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)




    科帮网 1、本主题所有言论和图片纯属会员个人意见,与本社区立场无关
    2、本站所有主题由该帖子作者发表,该帖子作者与科帮网享有帖子相关版权
    3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和科帮网的同意
    4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
    5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
    6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
    7、科帮网管理员和版主有权不事先通知发贴者而删除本文


    JAVA爱好者①群:JAVA爱好者① JAVA爱好者②群:JAVA爱好者② JAVA爱好者③ : JAVA爱好者③

    快速回复
    您需要登录后才可以回帖 登录 | 立即注册

       

    关闭

    站长推荐上一条 /1 下一条

    发布主题 快速回复 返回列表 联系我们 官方QQ群 科帮网手机客户端
    快速回复 返回顶部 返回列表