posts - 495,comments - 227,trackbacks - 0
          MYSQL BUG #5020
          描述:
             MYSQL網(wǎng)站BUG公示
          錯誤MESSAGE:
          ????
          Connection?was?closed?due?to?the?following?exception:

          **?BEGIN?NESTED?EXCEPTION?**?

          java.sql.SQLException
          MESSAGE:?Communication?link?failure:?java.net.SocketException,?underlying?cause:?Software?caused?connection?abort:?recv?failed

          **?BEGIN?NESTED?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)
          出錯原因:
             我們的系統(tǒng)一天24小時運行,但在夜晚的時候是沒有人連接的,因此Socket連接就超時了。早上嘗試做任何事情(比如:登錄)都將以失敗告終,除非我們關(guān)閉連接或者重新建立連接。3.0.11后才會發(fā)生這種情況。
             現(xiàn)在我們使用的MYSQL版本號為4.016,問題一樣。
          專家建議:
             [Mark Matthews],翻譯如下:
             注意:我不贊成Autoreconnect功能,在以后的發(fā)行版本中,它最終會被移除。在這種特殊情況下,它不起作用的原因是:在3.0.11以后,autoreconnect的方法變得更加安全了并且和阿utoCommit狀態(tài)有關(guān)聯(lián),這樣的話就能使當(dāng)前‘in-flight’事務(wù)失敗(如果你在失敗后,再次試圖連接事務(wù),就會重新被連接)。請查看相關(guān)解釋文檔,文檔的修復(fù)故障中包括如何正確實用這個屬性。無論在哪種情況下,   如果TCP/IP在沒有連接的情況下并且還不會冒著數(shù)據(jù)庫被癱瘓的危險,是沒有百分之百的方式使得JDBC驅(qū)動器被自動重連接的,這也是為何要移除Autoreconnect功能的原因。不管網(wǎng)絡(luò)發(fā)生什么情況,    JDBC 都不會說明這個連接是否處于連接狀態(tài)。JDBC driver 客戶端負(fù)責(zé)處理網(wǎng)絡(luò)故障,只有應(yīng)用程序本身(實際上是應(yīng)用程序的開發(fā)者)知道如何正確應(yīng)對事務(wù)失敗的情況。在服務(wù)器上過期的‘Waittimeout’基本上是服務(wù)器給與的強制性網(wǎng)絡(luò)故障。你通過把‘Waittimeout’設(shè)置的高點兒就可以改正它,盡管如此,作為一個開發(fā)者,你的代碼應(yīng)該包含相關(guān)的異常處理并采取適當(dāng)?shù)幕謴?fù)措施,不要都把它們傳到調(diào)用堆中。
             連接錯誤總是有一個SQL狀態(tài)‘08’。如果你發(fā)現(xiàn)它的話,你可以再連接一次并重試事務(wù)(如果是適當(dāng)?shù)脑挘?/span>
             不管什么原因,如果這樣不起作用的話,配置你的連接池來測試是否處于連接狀態(tài)并且那些長時間閑置連接(所有的連接池都能這樣做,但是它們的配置取決于池子)。
          作者說明:在MYSQL4.1以后的版本當(dāng)中,沒有“wait_timeout”變量,由
          interactiveClient代替
          參考資料:http://dev.mysql.com/doc/connector/j/en/cj-configuration-properties.html
          ???? [
          Kirk Wylie]:翻譯如下:
             
          如果有一個事務(wù)在運行的話,就能得到一個特別簡單的例子:
              
          ---如果連接在autoCommit模式下,autoReconnect是安全的。
              
          ---如果連接不在autoCommit模式下,但是沒有打開的事務(wù),autoReconnect是安全的。(因為連接可能在池在里面)
              ---如果連接不在autoCommit模式下,有打開的事務(wù),這樣就會拋出異常。
             
          這樣會解決你不在autoRecom\nnect模式下的憂慮并且會保留應(yīng)用程序的功能性。
             盡管如此,在它改變的時候,在改變?nèi)罩局袥]有任何記錄說明發(fā)生了改變,這點令我很煩。由于這種改變很可能破壞我的應(yīng)用程序,這種變化因該添加到CHANGE文件中。

            如下是我個人的做法:
            (STRUTS+SPRING+HIBERNATE)
            1、把mysql的變量
          interactiveClient由默認(rèn)的28800(8個小時)延長。并告知用戶多長時間后,重新啟動TOMCAT服務(wù)器。不過,MYSQL5.0.12版本以前的所有版本,只要你設(shè)置成了默認(rèn)語言為GBK,所有對interactive_timeout(wait_timeout)的時候如何設(shè)置,重新連接或者重新啟動MYSQL后,都是28800,現(xiàn)在我使用的5.0.18后,使用GBK,沒有問題。
            2、在HIBERNATE當(dāng)中加入:
             
          ..
          <property?name="hibernate.connection.url">jdbc:mysql://192.168.100.111/eai?autoReconnect=true</property>
          <property?name="enableDeprecatedAutoreconnect">true</property>
          <!--? 如下的語句是使用第三方的DBCP來建立連接池 -->
          <property name="dbcp.maxActive">100</property>
          <property name="dbcp.whenExhaustedAction">1</property>
          <!--? 看到了沒有,這個maxWait一定要大于MYSQL默認(rèn)的28800(秒) -->
          <property name="dbcp.maxWait">30000</property>
          <property name="dbcp.maxIdle">10</property>

          <property name="dbcp.ps.maxActive">100</property>
          <property name="dbcp.ps.whenExhaustedAction">1</property>
          <property name="dbcp.ps.maxWait">30000</property>
          <property name="dbcp.ps.maxIdle">10</property>
          ..
          ????
           如上兩種方法均可,推薦大家使用第二種方法,來遮擋一下MYSQL的BUG。
          如果有不對之處,請大家提出自己的見解。

          posted on 2006-08-04 20:16 SIMONE 閱讀(489) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 民丰县| 兴山县| 逊克县| 手游| 泉州市| 邳州市| 苍山县| 辽中县| 遂溪县| 富阳市| 崇左市| 金塔县| 亳州市| 固原市| 浦城县| 顺昌县| 金溪县| 江川县| 方山县| 宁波市| 呈贡县| 西乡县| 女性| 西乌珠穆沁旗| 绥滨县| 甘孜| 鄯善县| 华亭县| 门源| 城固县| 临海市| 大宁县| 克东县| 大港区| 大邑县| 广丰县| 隆化县| 万盛区| 辽阳市| 资溪县| 西华县|