現象:java
服務器是tomcat 6, 數據庫是Mysql 5.1。web應用部署後,週一到週六都運行正常,可是週日該應用就沒法鏈接數據庫。mysql
我是由於週一到週六一直都有訪問,若是是隔一段時間就不能鏈接數據庫,應該也是同樣的緣由。這裏先說現象而後說解決辦法最後說緣由。web
服務器報錯以下:sql
嚴重: java.sql.SQLException: Already closed.數據庫
com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception: windows
** BEGIN NESTED EXCEPTION ** tomcat
java.net.SocketException服務器
MESSAGE: Software caused connection abort: recv failedsocket
STACKTRACE:.net
java.net.SocketException: Software caused connection abort: recv failed
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(Unknown Source)
at com.mysql.jdbc.util.ReadAheadInputStream.fill(ReadAheadInputStream.java:113)
at com.mysql.jdbc.util.ReadAheadInputStream.readFromUnderlyingStreamIfNecessary(ReadAheadInputStream.java:160)
at com.mysql.jdbc.util.ReadAheadInputStream.read(ReadAheadInputStream.java:188)
at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:1953)
。。。。。。(省略)
** END NESTED EXCEPTION **
Last packet sent to the server was 0 ms ago.
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2579)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2867)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1616)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1708)
at com.mysql.jdbc.Connection.execSQL(Connection.java:3249)
。。。。。。(省略)
解決辦法:
1. 打開Mysql的安裝路徑,進入文件夾MySQL Server 5.1,找到文件my.ini(windows) 或 /etc/my.cnf 並打開,在文件最末尾添加:
interactive_timeout=288000
2. 重啓mysql服務
3. 重啓tomcat (爲了保險我重啓了,沒試過不重啓行不行,按道理不重啓也行)
ok 沒有了。等吧,到週日了, 問題不發生了。
緣由:
這個異常是因爲鏈接池的鏈接沒有被釋放,而MySQL默認的空閒等待時間是8個小時,也就是28800秒,一旦空閒超過8個小時,就會拋出異常。在my.ini文件末尾添加interactive_timeout=288000,其實是將MySQL默認的空閒等待時間設置爲80小時,這樣暫時就沒問題了。
可是真有一次就是80多小時的空閒時間呢?不怕,改爲315360000, 也就是10年。。。
呵呵,雖然認爲這是一種解決辦法,可是我的情感上老是過不去,還在考慮其餘的解決辦法。保持更新。。。