一个MySQL连接的问题...

Spring89 2011-03-11 10:26:58
工程在本地每天第一次运行,不会抛异常。但是放在服务器上每天第一行访问,抛出异常:

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
...全文
301 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
duben4814 2011-03-11
  • 打赏
  • 举报
回复
这个错对运行没多大影响吧,用的是tomcat的话,删掉Tomcat 6.0\work 下的文件试试
Spring89 2011-03-11
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 linya333 的回复:]
你确定其他服务都启动了没?
[/Quote]
第一次访问有错,随后在刷新一次,就没错了!
linya333 2011-03-11
  • 打赏
  • 举报
回复
你确定其他服务都启动了没?
Spring89 2011-03-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 im8888 的回复:]
你改过你计算机的IP ??
在你的applicationContext.xml中把你的服务器IP该一下就行了
[/Quote]
没有,我是访问服务器上的,没有用Spring
IM8888 2011-03-11
  • 打赏
  • 举报
回复
你改过你计算机的IP ??
在你的applicationContext.xml中把你的服务器IP该一下就行了
Spring89 2011-03-11
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 zxingchao2009 的回复:]
你的这个类跟我发的那个不一样,不用改了。我刚搜了半天,也未果,我感觉是你数据库操作完之后没有关闭connection,然后那个连接一个开着,8小时之后就断开了,故引发此异常,检查一下每次数据库操作完之后是否都释放了资源,还有数据库连接池配置是否有什么不当,实在不行就给mysql的配置文件吧!
[/Quote]
本地就不会呀!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&characterEncoding=utf-8&autoReconnect=true"
maxActive="1000" maxIdle="10" />
这就是连接的配置
UPC_思念 2011-03-11
  • 打赏
  • 举报
回复
你的这个类跟我发的那个不一样,不用改了。我刚搜了半天,也未果,我感觉是你数据库操作完之后没有关闭connection,然后那个连接一个开着,8小时之后就断开了,故引发此异常,检查一下每次数据库操作完之后是否都释放了资源,还有数据库连接池配置是否有什么不当,实在不行就给mysql的配置文件吧!
Spring89 2011-03-11
  • 打赏
  • 举报
回复
"而是每次有数据库请求的时候都去初始化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;
}
}


你认为该如何改?
UPC_思念 2011-03-11
  • 打赏
  • 举报
回复
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对象。

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧