首页 > 代码库 > MYSQL连接一段时间不操作后出现异常的解决方案

MYSQL连接一段时间不操作后出现异常的解决方案

  • 最近做的网站使用的是MYSQL数据库 发现 果超过8小时应用程序不去访问数据库,数据库就断掉连接 。这时再次访问就会抛出异常,如下所示:

    com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failureLast 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也没有效果。

    • 本文来自:Linux教程网

MYSQL连接一段时间不操作后出现异常的解决方案