Pages

搜尋此網誌

2014年1月8日 星期三

SQL state [HY010]; error code [0]; Invalid state, the Connection object is closed 處理筆記

SQL state [HY010]; error code [0]; Invalid state, the Connection object is closed 處理筆記

之前曾經遇到過,最近又來了…

果然該還的還是要還,因此這次要詳細記錄處理過程,希望以後再發生可以更快釐清問題。

首先需要先確定發生可能原因,google 了一下目前比較明確的錯誤狀況如下:

  1. 到了連線 timeout 時間
  2. drive 的問題
  3. 或是 database server 被重啟

我查了一下預設的 connection pool 的 timeout 時間有 30000 ms,所以第一項先不考慮。

drive 問題目前發生問題的是 jtds 1.3.1,有人說換換看 ms sql 所提供的 drive,在 sql 2008、O.S. 為 64 位元的情況會比較沒問題,well 姑且試試看。

檢視 database 的 log 記錄,似乎有重啟的狀況,如下圖:

enter image description here

在持續觀察中發現確實隔天早上資料庫被重啟(os 重新啟動),另外一個可調整的地方就是設置 connection pool 的 setTestOnBorrow:取出 pool 中的連線時進行驗證,若沒有通過則會在取出新的連線,這應該是我們要的參數,經過下列測試步驟:

未設置 testOnBorrow 的情形

  1. 啟動服務,進行資料查詢正常
  2. 暫停 sql server
  3. 暫停中進行資料查詢,吐出訊息 SQLServerException: Broken pipe
  4. 啟動 sql server
  5. 再次進行查詢,吐出訊息 SQL state [null]; error code [0]; 連接已關閉

有設置 testOnBorrow 的情形

  1. 啟動服務,進行資料查詢正常
  2. 暫停 sql server
  3. 暫停中進行資料查詢,吐出訊息 SQLServerException: Broken pipe
  4. 啟動 sql server
  5. 再次進行查詢,資料查詢正常

這樣一來即使遠端連結的資料庫主機重啟,或是關閉的情形,一旦該主機重新上線,我們的應用程式也不用重開令 pool 重新連線,才不會總是鬼打牆,服務明明好好得但就是會出現連線異常,檢視遠端 db 主機也在線上,殊不知曾經被重啟過。

另外 testOnBorrow 需要搭配 validationQuery 使用,可參考下面連結:Database Connectors,最下方的 Database Reference Table 有各個不同 databse 的 validationQuery 可以參考。

一件落著!

不過我的測試案例出現的是 SQL state [null]; 而不是 SQL state [HY010];,還是要在觀察一下。

若有朋友有關於此問題有處理經驗或建議,也請指教,感謝!

張貼留言