之前曾經遇到過,最近又來了…
果然該還的還是要還,因此這次要詳細記錄處理過程,希望以後再發生可以更快釐清問題。
首先需要先確定發生可能原因,google 了一下目前比較明確的錯誤狀況如下:
- 到了連線 timeout 時間
- drive 的問題
- 或是 database server 被重啟
我查了一下預設的 connection pool 的 timeout 時間有 30000 ms,所以第一項先不考慮。
drive 問題目前發生問題的是 jtds 1.3.1,有人說換換看 ms sql 所提供的 drive,在 sql 2008、O.S. 為 64 位元的情況會比較沒問題,well 姑且試試看。
檢視 database 的 log 記錄,似乎有重啟的狀況,如下圖:
在持續觀察中發現確實隔天早上資料庫被重啟(os 重新啟動),另外一個可調整的地方就是設置 connection pool 的 setTestOnBorrow:取出 pool 中的連線時進行驗證,若沒有通過則會在取出新的連線,這應該是我們要的參數,經過下列測試步驟:
未設置 testOnBorrow 的情形
- 啟動服務,進行資料查詢正常
- 暫停 sql server
- 暫停中進行資料查詢,吐出訊息
SQLServerException: Broken pipe
- 啟動 sql server
- 再次進行查詢,吐出訊息
SQL state [null]; error code [0]; 連接已關閉
有設置 testOnBorrow 的情形
- 啟動服務,進行資料查詢正常
- 暫停 sql server
- 暫停中進行資料查詢,吐出訊息
SQLServerException: Broken pipe
- 啟動 sql server
- 再次進行查詢,資料查詢正常
這樣一來即使遠端連結的資料庫主機重啟,或是關閉的情形,一旦該主機重新上線,我們的應用程式也不用重開令 pool 重新連線,才不會總是鬼打牆,服務明明好好得但就是會出現連線異常,檢視遠端 db 主機也在線上,殊不知曾經被重啟過。
另外 testOnBorrow 需要搭配 validationQuery 使用,可參考下面連結:Database Connectors,最下方的 Database Reference Table 有各個不同 databse 的 validationQuery 可以參考。
一件落著!
不過我的測試案例出現的是 SQL state [null];
而不是 SQL state [HY010];
,還是要在觀察一下。
若有朋友有關於此問題有處理經驗或建議,也請指教,感謝!
沒有留言:
張貼留言