原創:解決tomcat: Software caused connection abort: ...

現象: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年。。。


呵呵,雖然認爲這是一種解決辦法,可是我的情感上老是過不去,還在考慮其餘的解決辦法。保持更新。。。

相關文章
相關標籤/搜索