了解 JDBC 驅動程式中的逾時屬性

下載 JDBC 驅動程式

JDBC 驅動程式中的逾時設定可用來設定應用程式回應性的優先順序。 根據預設,大部分驅動程式的逾時會優先等候結果,以確保資料一致性。 請確保您選擇符合應用程式需求的逾時設定。

針對初始連線,loginTimeout 會使用於:

  • loginTimeout 是驅動程式等待建立與伺服器連線的秒數。 如果超過此時間限制,驅動程式會回傳錯誤,且不會建立連線。 0 值則將逾時設定為預設系統逾時,JDBC 驅動程式 11.2 及後版本為 30 秒。 在 JDBC 驅動程式 10.2 及更早版本中,預設逾時為 15 秒。 任何非零值都會決定駕駛在計時失敗連線前等待的秒數。 如果你一直無法與 JDBC 驅動建立連線,可能需要將超時時間延長到 90 秒甚至 120 秒。 loginTimeout同時也會限制驅動程式的連線重試次數,而非僅僅一次嘗試,這點在你連接到自動暫停的 Azure SQL Database 無伺服器資料庫時很重要。 欲了解更多資訊,請參閱 「連接至自動暫停的無伺服器資料庫」。

建立連線之後,陳述式執行期間會使用 queryTimeout、cancelQueryTimeout 和 lockTimeout。 socketTimeout 用於與伺服器的任何驅動程式通訊。

  • queryTimeout 是時間,以秒為單位,驅動程式會在將執行命令傳送至伺服器之後等候,以接收來自具有資料的伺服器回應。 如果超過這個時間,則會取消命令。 超過此逾時時間也不會關閉連線。 預設值為 -1,表示無限期逾時。
  • cancelQueryTimeout 是時間,以秒為單位,驅動程式會先等候伺服器確認 queryTimeout 取消,然後再強制終止/關閉連線。 也就是說,驅動程式會在連線關閉之前,等候 cancelQueryTimeout 加 queryTimeout 秒的總時長。 將此逾時設定為非零值可確保當伺服器發生網路或通訊失敗時、當查詢逾時時,應用程式仍能保持回應。此屬性的預設值為 -1,這是無限的等候時間。
  • lockTimeout 是在有鎖定封鎖陳述式執行的情況下,等候釋放鎖定的時間長度。 超過此逾時並不會導致關閉連線。 此屬性的預設值為 -1,這是無限的等候時間。
  • socketTimeout 適用於與伺服器的所有通訊端通訊。 如果伺服器藉由不認可或不回覆數據來停止與驅動程式的通訊,則驅動程式會在關閉連線之前等候 socketTimeout 的值。 將此逾時設定為非零值可確保如果伺服器發生網路或通訊失敗,應用程式仍可保持回應。 預設值為 0,表示無限期逾時。 請確定 socketTimeout 大於 queryTimeout ,以避免在 queryTimeout 範圍期間發生通訊端逾時例外狀況。 同樣地,請確定 socketTimeout 大於 cancelQueryTimeout,以避免在 cancelQueryTimeout 範圍期間發生通訊端逾時例外狀況。

應用程式的合理逾時值取決於應用程式的優先順序。 設定較低的逾時值,會將應用程式回應性優先於資料一致性。 當發生逾時時,應用程式需要決定最佳的處理方式。 該決策以執行的資料庫動作為基礎。 例如,對一個 SELECT 語句來說,決策可能是向使用者報告錯誤,或是重新連線並重試。 對於 INSERT 或 UPDATE 陳述式,該決定可能會有所不同。

針對回應式應用程式,loginTimeout 及 queryTimeout 應設定為相對較低的值。 同樣地,cancelQueryTimeout 也應設為較低的值,以確保當超過 queryTimeout 時,驅動程式不會等待伺服器確認查詢取消太久。 最後,socketTimeout 應設定為可防止驅動程式在任何與伺服器連線中斷的情況下等待過久(例如網路中斷、伺服器當機等)。

屬性摘要

屬性 說明 預設 連線結果
loginTimeout 驅動程式在將失敗的連線判定為逾時之前應等待的秒數。 30 秒 [11.2+],
否則為 15 秒
關閉連線
queryTimeout 取消查詢之前要等候的秒數。 -1 [無限逾時] 開啟連線
cancelQueryTimeout 等待 QueryTimeout 取消作業確認所需的秒數。 -1 [無限逾時] 關閉連線
lockTimeout 資料庫傳回鎖定逾時錯誤前的等候毫秒數。 -1 [無限逾時] 開啟連線
socketTimeout 通訊端讀取或寫入作業時要等待的毫秒數。 零 [無限逾時] 關閉連線