資料庫連線異常例外處理:網路異常影響造成 Database Driver 呼叫 getConnection() 失敗的異常情況

  • 369
  • 0
  • 2018-07-04

資料庫連線異常例外處理:網路異常影響造成 Database Driver 呼叫 getConnection() 失敗的異常情況

Connection pool 通常有設置連線逾時設定(connection timeout)。

Application 通常在異常狀態下會取得系統回傳的例外狀態,使connection pool以及程式可供判斷,暫停建立異常連線,避免造成資源耗盡情況。

但不同的資料庫連接元件(Database Driver)提供的處理機制不盡相同,較早期且通用的元件(例如:C3PO或DBCP)對於網路斷線造成的連線異常,無法正確的反應並識別。

故有些使用上述原件系統,於需要離線維護的情況,會將 Application 網址導向系統維護畫面,並於連線回覆後重新啟動 Application 。

#

Database Driver

執行狀態

結論

備註

1

DBCP/C3PO

階段1:

無法正常取得資料庫連線,因為進行偵測TCP流量,故未能判斷網路造成的TimeOut例外。

階段2:

因未能判斷connection物件中的資料庫連線是否正常連結,故驗證查詢testConnectionOnCheckout()會先等待驗證查詢回應,約需 2 分鐘後才能回覆並擲出錯誤;重新呼叫getConnection()時會立即失敗。

實際上無法處理,直到作業系統層級TCP TIMEOUT後才擲回例外。

常見通用資料庫連接元件。

2

Vibur

能夠正確擲出逾時例外。

能夠正確處理網路連結逾時。

需啟用setUseNetworkTimeout(true)設定。

3

HikariCP

能夠正確擲出逾時例外。

能夠正確處理網路連結逾時。

高效能,惟使用更多資源在環境偵測。