Exception: socket write error

有個之前用 Java 連接 MySQL 寫的 Project 每隔一段時間就會自已出現如下的 “socket write error" exception。而且是不定時發生,發生後只要隨便執行任一個功能,馬上就又恢復正常。

java.net.SocketException
MESSAGE: Software caused connection abort: socket write error

STACKTRACE:
java.net.SocketException: Software caused connection abort: socket write error at java.net.SocketOutputStream.socketWrite0(Native Method)

找了一下後發現,原來這個問題早就在 MySQL 的 “Common Problems and Solutions" 中有提到。原因是 MySQL 會在超過8個小時沒有任何活動後,自動關閉所有的資料庫連線,所以當程式超過8個小時後要再次存取 DB 時,便會發生 exception。

第一個解決方法很簡單,只要在MySQL的連線字串中加上 autoReconnect=true 的參數,要求MySQL自動重新建立連線即可。但 MySQL 官方不建議採用這種做法,也說明 autoReconnect 已經是 deprecated 了的方法,未來可能會被移除。

正確的做法是要自已攔截這個 SQL Exception 利用 ex.getSQLState().equals(“08S01″) 判斷是否為此狀況,然後再重試一次資料庫操作。不過我沒空改程式,所以還是用了簡單的解法先檔著用了 :p。