工程在本地每天第一次运行,不会抛异常。但是放在服务器上每天第一行访问,抛出异常:com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception: ** BEGIN NESTED EXCEPTION ** java.io.EOFException
MESSAGE: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.STACKTRACE:
autoReconnect=true 
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:1997)
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2411)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2916)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1631)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1723)
at com.mysql.jdbc.Connection.execSQL(Connection.java:3277)
at com.mysql.jdbc.Connection.execSQL(Connection.java:3206)
at com.mysql.jdbc.Statement.executeQuery(Statement.java:1232)
at org.apache.tomcat.dbcp.dbcp.DelegatingStatement.executeQuery(DelegatingStatement.java:208)
at com.joye.dao.BaseDAO.executeQuery(BaseDAO.java:36)
at com.joye.dao.PrdTypeDAO.getProductType(PrdTypeDAO.java:35)
at com.joye.service.PrdTypeService.getProductType(PrdTypeService.java:35)
at com.joye.action.ProductAction.init(ProductAction.java:550)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:274)
at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:194)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:419)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)
at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at com.joye.filter.CharacterSetEncodingFilter.doFilter(CharacterSetEncodingFilter.java:27)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:396)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
** END NESTED EXCEPTION **Last packet sent to the server was 0 ms ago.
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2622)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2916)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1631)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1723)
at com.mysql.jdbc.Connection.execSQL(Connection.java:3277)
at com.mysql.jdbc.Connection.execSQL(Connection.java:3206)
at com.mysql.jdbc.Statement.executeQuery(Statement.java:1232)
at org.apache.tomcat.dbcp.dbcp.DelegatingStatement.executeQuery(DelegatingStatement.java:208)
at com.joye.dao.BaseDAO.executeQuery(BaseDAO.java:36)
at com.joye.dao.PrdTypeDAO.getProductType(PrdTypeDAO.java:35)
at com.joye.service.PrdTypeService.getProductType(PrdTypeService.java:35)
at com.joye.action.ProductAction.init(ProductAction.java:550)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:274)
at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:194)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:419)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)
at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at com.joye.filter.CharacterSetEncodingFilter.doFilter(CharacterSetEncodingFilter.java:27)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:396)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
我知道这问题的原因,是mysql默认连接时间为8小时,一旦超过这个时间,将自动断开,所以每天客户端第一次访问就抛出这个异常!解决办法不要说改连接时间,因为是治标不治本的。用的是纯JDBC,没有Hibernate、Ibatis

解决方案 »

  1.   

    你改过你计算机的IP ??
    在你的applicationContext.xml中把你的服务器IP该一下就行了
      

  2.   

    http://hi.baidu.com/deityz/blog/item/0b22f744d3775e87b3b7dc2c.html
      

  3.   

    没有,我是访问服务器上的,没有用Spring
      

  4.   

    这个错对运行没多大影响吧,用的是tomcat的话,删掉Tomcat 6.0\work 下的文件试试
      

  5.   

    mysql默认连接时间的确为为8小时,我上次也遇到过相似的例子。有个同事直接连接数据库的那个类写成了单例模式,代码如下:
    package com.anxin.utils;import java.sql.Connection;import javax.naming.InitialContext;
    import javax.naming.NamingException;
    import javax.sql.DataSource;public class DBUtil {
    private Connection conn;
    private static DBUtil dbUtil; private DBUtil() {
    try {
    Class.forName("com.mysql.jdbc.Driver");
    } catch (Exception e) {
    System.out.println("Get driverclass fail.");
    } String datasource = "java:comp/env/mydb";
    DataSource ds = null;
    try {
    InitialContext ctx = new InitialContext();
    ds = (DataSource) ctx.lookup(datasource);
    } catch (NamingException ne) {
    System.out.println("Lookup Datasource fail.");
    ne.printStackTrace(System.out);
    } try {
    this.conn = ds.getConnection();
    } catch (Exception e) {
    System.out.println("Get connection fail.");
    e.printStackTrace(System.out);
    }
    } public static Connection getConnection() {
    if (dbUtil == null) {
    System.out.println("DBUtil.getConnection");
    dbUtil = new DBUtil();
    }
    return dbUtil.conn;
    }}
    connection只初始化一次,过8小时之后如果再操作数据库的话就会出现那样的异常,原因就是mysql数据库连接最长持续时间为8个小时,之后就失去连接,解决方法我修改了mysql的配置文件my.ini,在最后加入
    wait_timeout=2880000之后异常就没有了。但是最根本的原因是数据库连接的这个类不能写成单例模式,而是每次有数据库请求的时候都去初始化connection,而不是公用一个connection对象。
      

  6.   

    "而是每次有数据库请求的时候都去初始化connection,而不是公用一个connection对象。"
    不太明白你说的意思,下面是我的代码:public class DBConn {
    public static Connection getConnection() {
    Connection conn=null;
    try {
    Context ctx = new InitialContext();
    DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/aero");
    conn = ds.getConnection();

    catch (SQLException e) {
    e.printStackTrace();
    }
    catch (NamingException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    return conn;
    }
    }
    你认为该如何改?
      

  7.   

    你的这个类跟我发的那个不一样,不用改了。我刚搜了半天,也未果,我感觉是你数据库操作完之后没有关闭connection,然后那个连接一个开着,8小时之后就断开了,故引发此异常,检查一下每次数据库操作完之后是否都释放了资源,还有数据库连接池配置是否有什么不当,实在不行就给mysql的配置文件吧!
      

  8.   

    本地就不会呀!mysql的配置文件?没有改呀!
    <Resource name="jdbc/aero" auth="Container" type="javax.sql.DataSource"
    username="root" password="root" driverClassName="com.mysql.jdbc.Driver"
    url="jdbc:mysql://localhost:3306/aeroflex?useUnicode=true&amp;characterEncoding=utf-8&amp;autoReconnect=true" 
    maxActive="1000" maxIdle="10" />
    这就是连接的配置