1. 程式人生 > >(2)Mysql ----- The last packet successfully received from the server was *** millisecond ago.The

(2)Mysql ----- The last packet successfully received from the server was *** millisecond ago.The

java.lang.RuntimeException: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet sent successfully to the server was 19365 milliseconds ago. The driver has not received any packets from the server.
       at MJ.SITEMAP.ExtensionFun.IndexSplit.Create(IndexSplit.java:44)
       at MJ.SITEMAP.SiteMapDO.call(SiteMapDO.java:111)
       at MJ.SITEMAP.SiteMapDO.call(SiteMapDO.java:1)
       at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
       at java.util.concurrent.FutureTask.run(FutureTask.java:138)
       at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
       at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
       at java.util.concurrent.FutureTask.run(FutureTask.java:138)
       at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
       at java.lang.Thread.run(Thread.java:619)
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
       at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
       at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
       at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
       at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
       at com.mysql.jdbc.Util.handleNewInstance(Util.java:409)
       at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1122)
       at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2260)
       at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:787)
       at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:49)
       at sun.reflect.GeneratedConstructorAccessor7.newInstance(Unknown Source)
       at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
       at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
       at com.mysql.jdbc.Util.handleNewInstance(Util.java:409)
       at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:357)
       at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:285)
       at java.sql.DriverManager.getConnection(DriverManager.java:582)
       at java.sql.DriverManager.getConnection(DriverManager.java:207)
       at MJ.SITEMAP.Data.SQLData(Data.java:54)
       at MJ.SITEMAP.ExtensionFun.IndexSplit.DOREPEAT(IndexSplit.java:130)
       at MJ.SITEMAP.ExtensionFun.IndexSplit.AnalysisTemplate(IndexSplit.java:58)
       at MJ.SITEMAP.ExtensionFun.IndexSplit.Create(IndexSplit.java:34)
       ... 10 more
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
       at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
       at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
       at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
       at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
       at com.mysql.jdbc.Util.handleNewInstance(Util.java:409)
       at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1122)
       at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:344)
       at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2181)
       ... 24 more
Caused by: java.net.ConnectException: Connection timed out: connect
       at java.net.PlainSocketImpl.socketConnect(Native Method)
       at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
       at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
       at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
       at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
       at java.net.Socket.connect(Socket.java:525)
       at java.net.Socket.connect(Socket.java:475)
       at java.net.Socket.<init>(Socket.java:372)
       at java.net.Socket.<init>(Socket.java:215)
       at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:256)
       at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:293)
       ... 25 more

使用Connector/J連線MySQL資料庫,程式執行較長時間後就會報以下錯誤:

Communications link failure,The last packet successfully received from the server was *** millisecond ago.The last packet successfully sent to the server was ***  millisecond ago。

其中錯誤還會提示你修改wait_timeout或是使用Connector/J的autoReconnect屬性避免該錯誤。(我的錯誤沒有這樣的提示)

後來查了一些資料,才發現遇到這個問題的人還真不少,大部分都是使用連線池方式時才會出現這個問題,短連線應該很難出現這個問題。這個問題的原因

MySQL伺服器預設的“wait_timeout”是28800秒即8小時,意味著如果一個連線的空閒時間超過8個小時,MySQL將自動斷開該連線,而連線池卻認為該連線還是有效的(因為並未校驗連線的有效性),當應用申請使用該連線時,就會導致上面的報錯。

1.按照錯誤的提示,可以在JDBC URL中使用autoReconnect屬性,實際測試時使用了autoReconnect=true&failOverReadOnly=false,不過並未起作用,

使用的是5.1版本,可能真像網上所說的只對4之前的版本有效。

2.沒辦法,只能修改MySQL的引數了,wait_timeout最大為31536000即1年,在my.cnf中加入:

[mysqld]

wait_timeout=31536000

interactive_timeout=31536000

重啟生效,需要同時修改這兩個引數。

還有評論說:從某個地方看到.timeout最多是2147483(24天)吧,就算設定了大於這個數,也是按照這個來算的。

雖然報了這個異常,我的程式還是照常工作,這個也許是mysql的bug吧!哎!鬱悶!怕以後不知道會不會影響我的應用,這幾天發現了2個mysql的bug了。