資料庫連線異常例外處理:網路異常影響造成 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 |
能夠正確擲出逾時例外。 |
能夠正確處理網路連結逾時。 |
高效能,惟使用更多資源在環境偵測。 |