mysql个版本bug_MYSQL BUG #5020及解决方法

MYSQL网站BUG公示

错误MESSAGE:

Connection was closed duetothe following exception:**BEGINNESTED EXCEPTION**java.sql.SQLException

MESSAGE: Communication link failure: java.net.SocketException, underlying cause: Software caused connection abort: recv failed**BEGINNESTED EXCEPTION**java.net.SocketException

MESSAGE: Software caused connection abort: recv failed

STACKTRACE:

java.net.SocketException: Software caused connection abort: recv failed

at java.net.SocketInputStream.socketRead0(Native Method)

at java.net.SocketInputStream.read(SocketInputStream.java:129)

at java.io.BufferedInputStream.fill(BufferedInputStream.java:183)

at java.io.BufferedInputStream.read1(BufferedInputStream.java:222)

at java.io.BufferedInputStream.read(BufferedInputStream.java:277)

at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:1385)

at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:1532)

at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:1923)

at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1163)

at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1272)

at com.mysql.jdbc.Connection.execSQL(Connection.java:2236)

at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1555)

at net.sf.hibernate.impl.BatcherImpl.getResultSet(BatcherImpl.java:89)

at net.sf.hibernate.loader.Loader.getResultSet(Loader.java:880)

at net.sf.hibernate.loader.Loader.doQuery(Loader.java:273)

at net.sf.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:138)

at net.sf.hibernate.loader.Loader.doList(Loader.java:1063)

at net.sf.hibernate.loader.Loader.list(Loader.java:1054)

at net.sf.hibernate.hql.QueryTranslator.list(QueryTranslator.java:854)

at net.sf.hibernate.impl.SessionImpl.find(SessionImpl.java:1554)

at net.sf.hibernate.impl.SessionImpl.find(SessionImpl.java:1531)

at net.sf.hibernate.impl.SessionImpl.delete(SessionImpl.java:1678)

at net.sf.hibernate.impl.SessionImpl.delete(SessionImpl.java:1664)出错原因:

我们的系统一天24小时运行,但在夜晚的时候是没有人连接的,因此Socket连接就超时了。早上尝试做任何事情(比如:登录)都将以失败告终,除非我们关闭连接或者重新建立连接。到3.0.11后才会发生这种情况。

现在我们使用的MYSQL版本号为4.016,问题一样。

专家建议:

[Mark Matthews],翻译如下:

注意:我不赞成Autoreconnect功能,在以后的发行版本中,它最终会被移除。在这种特殊情况下, 它不起作用的原因是:在3.0.11以后,autoreconnect的方法变得更加安全了并且和阿utoCommit状态有关联,这样的话就能使当前‘in-flight’事务失败(如果你在失败后,再次试图连接事务,就会重新被连接)。请查看相关解释文档,文档的修复故障中包括如何正确实用这个属性。无论在哪种情况下,   如果TCP/IP在没有连接的情况下并且还不会冒着数据库被瘫痪的危险,是没有百分之百的方式使得JDBC驱动器被自动重连接的,这也是为何要移除Autoreconnect功能的原因。不管网络发生什么情况,JDBC都不会说明这个连接是否处于连接状态。JDBC driver客户端负责处理网络故障,只有应用程序本身(实际上是应用程序的开发者)知道如何正确应对事务失败的情况。在服务器上过期的‘Wait—timeout’基本上是服务器给与的强制性网络故障。你通过把‘Wait—timeout’设置的高点儿就可以改正它,尽管如此,作为一个开发者,你的代码应该包含相关的异常处理并采取适当的恢复措施,不要都把它们传到调用堆中。连接错误总是有一个SQL状态‘08’。如果你发现它的话,你可以再连接一次并重试事务(如果是适当的话)不管什么原因,如果这样不起作用的话,配置你的连接池来测试是否处于连接状态并且那些长时间闲置连接(所有的连接池都能这样做,但是它们的配置取决于池子)。

作者说明:在MYSQL4.1以后的版本当中,没有“wait_timeout”变量,由interactiveClient代替

参考资料:http://dev.mysql.com/doc/connector/j/en/cj-configuration-properties.html

[Kirk Wylie]:翻译如下:如果有一个事务在运行的话,就能得到一个特别简单的例子:---如果连接在autoCommit模式下,autoReconnect是安全的。---如果连接不在autoCommit模式下,但是没有打开的事务,autoReconnect是安全的。(因为连接可能在池在里面)---如果连接不在autoCommit模式下,有打开的事务,这样就会抛出异常。这样会解决你不在autoRecom\nnect模式下的忧虑并且会保留应用程序的功能性。尽管如此,在它改变的时候,在改变日志中没有任何记录说明发生了改变,这点令我很烦。由于这种改变很可能破坏我的应用程序,这种变化因该添加到CHANGE文件中。

如下是我个人的做法:

(STRUTS+SPRING+HIBERNATE)

1、把mysql的变量interactiveClient由

默认的28800(8个小时)延长。并告知用户多长时间后,重新启动TOMCAT服务器。不过,MYSQL5.0.12版本以前的所有版本,只要你设置成

了默认语言为GBK,所有对interactive_timeout(wait_timeout)的时候如何设置,重新连接或者重新启动MYSQL后,都

是28800,现在我使用的5.0.18后,使用GBK,没有问题。

2、在HIBERNATE当中加入:

9b8a8a44dd1c74ae49c20a7cd451974e.png

9b8a8a44dd1c74ae49c20a7cd451974e.png

9b8a8a44dd1c74ae49c20a7cd451974e.png

9b8a8a44dd1c74ae49c20a7cd451974e.png

9b8a8a44dd1c74ae49c20a7cd451974e.png

9b8a8a44dd1c74ae49c20a7cd451974e.png..jdbc:mysql://192.168.100.111/eai?autoReconnect=truetrue

100

1

30000

10

100

1

30000

109b8a8a44dd1c74ae49c20a7cd451974e.png

9b8a8a44dd1c74ae49c20a7cd451974e.png

9b8a8a44dd1c74ae49c20a7cd451974e.png

9b8a8a44dd1c74ae49c20a7cd451974e.png

9b8a8a44dd1c74ae49c20a7cd451974e.png

9b8a8a44dd1c74ae49c20a7cd451974e.png..    

如上两种方法均可,推荐大家使用第二种方法,来遮挡一下MYSQL的BUG。

如果有不对之处,请大家提出自己的见解。

posted on 2006-01-18 14:48 @家军 阅读(5095) 评论(0)  编辑  收藏 所属分类: J2EE技术类

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值