今晚发现无法撰写日志,查看Resin日志如下,baidu和google搜索一系列解决方法皆未果。
奇怪的是,只是Statement无法操作数据库,select和update都正常。重启MySQL Server,错误仍旧,只有重启Resin才正常。真是郁闷。
错误有待研究。以下是错误日志:
STACKTRACE:
com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception:
** BEGIN NESTED EXCEPTION **
java.net.SocketException
MESSAGE: Software caused connection abort: socket write error
STACKTRACE:
java.net.SocketException: Software caused connection abort: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:65)
at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:123)
at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:2590)
at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:2523)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1517)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1626)
at com.mysql.jdbc.Connection.execSQL(Connection.java:3031)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:943)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1184)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1101)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1086)
at org.javawind.servlet.AjaxPost.ajax_SaveModify(AjaxPost.java:117)
at org.javawind.servlet.AjaxPost.doPost(AjaxPost.java:47)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:153)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:91)
at com.caucho.server.dispatch.ServletFilterChain.doFilter(ServletFilterChain.java:103)
at org.javawind.filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:30)
at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:76)
at com.caucho.server.webapp.WebAppFilterChain.doFilter(WebAppFilterChain.java:178)
at com.caucho.server.dispatch.ServletInvocation.service(ServletInvocation.java:241)
at com.caucho.server.http.HttpRequest.handleRequest(HttpRequest.java:268)
at com.caucho.server.port.TcpConnection.run(TcpConnection.java:586)
at com.caucho.util.ThreadPool$Item.runTasks(ThreadPool.java:690)
at com.caucho.util.ThreadPool$Item.run(ThreadPool.java:612)
at java.lang.Thread.run(Thread.java:595)
** END NESTED EXCEPTION **
Last packet sent to the server was 0 ms ago.
at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:2605)
at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:2523)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1517)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1626)
at com.mysql.jdbc.Connection.execSQL(Connection.java:3031)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:943)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1184)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1101)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1086)
at org.javawind.servlet.AjaxPost.ajax_SaveModify(AjaxPost.java:117)
at org.javawind.servlet.AjaxPost.doPost(AjaxPost.java:47)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:153)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:91)
at com.caucho.server.dispatch.ServletFilterChain.doFilter(ServletFilterChain.java:103)
at org.javawind.filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:30)
at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:76)
at com.caucho.server.webapp.WebAppFilterChain.doFilter(WebAppFilterChain.java:178)
at com.caucho.server.dispatch.ServletInvocation.service(ServletInvocation.java:241)
at com.caucho.server.http.HttpRequest.handleRequest(HttpRequest.java:268)
at com.caucho.server.port.TcpConnection.run(TcpConnection.java:586)
at com.caucho.util.ThreadPool$Item.runTasks(ThreadPool.java:690)
at com.caucho.util.ThreadPool$Item.run(ThreadPool.java:612)
at java.lang.Thread.run(Thread.java:595)
** END NESTED EXCEPTION **
对不起,操作数据库失败!-->Statement
问题已经得到解决:
try {
取连接;
操作数据库;
}finally {
释放连接;
}
}
这个是最标准的做法,在init和destroy中获取和释放是不正确的做法
1F / 2007-12-13 18:14:20
路过~`一头雾水~~
2F / 2007-12-13 21:07:25
郁闷 ; 今天又出现了
3F / 2007-12-14 00:07:09
Mysql服务器默认的“wait_timeout”是8小时,也就是说一个connection空闲超过8个小时,Mysql将自动断开该connection。解决方法:增加wait_timeout的时间。
4F / 2007-12-14 01:13:31
感谢楼上的回复,这个问题我已经找到原因,就是你所说的默认wait_timeout时间。
不过,增加这个时间亦不是最佳的解决方法。我发现是我的Servlet连接了数据库,而没有及时释放连接造成的,在8小时内没有访问这个servlet的话,之后再次访问就会报错了。
解决方法,我正在处理当中。就是要及时释放数据库连接,需要使用的时候再次连接MySQL。不让连接长期处于sleep状态。
由于这个blog是我的第一个JSP作品,代码很混乱和垃圾,有时间我打算采用 Hibernate、Struts、JSF等再做一个多用户的。
5F / 2007-12-14 09:58:17
我觉得使用Hibernate对于这个问题也无济于事,我目前也受这个问题困扰,也是刚刚找到这个原因。我在hibernate中用proxool管理连接池,布署的系统只有白天才使用,过了晚上超过8个小时的空闲时间后,早上一用就出现com.mysql.jdbc.CommunicationsException异常了。现在增加wait_timeout时间,保证了到第二天再次使用时仍未达到MySQL自动断开时间。其实还有一个方法可以试试,就是在系统中做一个定时器,几个小时就自动连接一下数据库。如果你找到了更好的解决办法,希望能公布一下让大家受益:)
6F / 2007-12-31 22:44:17
这个问题以前见过,后来求助后人家告诉我在连接池里配置autoReconnect=true,即可。