訪問一個 IBM Informix 數據庫所需的時間通常在不到一秒鐘到某個期望的時間段之內,這取決于具體的數據庫操作。但是,有時花費時間可能會比您預期的要長得多,這有許多原因,比如網絡速度、系統性能、系統負載等。
在最糟的情況下,informix 客戶端可能會因為無法獲得期望的響應而永遠被阻塞。本文將解釋,在 sql 或連接請求花費比預期更長時間時,如何中斷該 sql 或請求,以改善您的 informix 應用程序的性能。
數據可訪問性在眾多業務中變得越來越重要。Informix 服務器因其快速的性能和高度的可靠性而著稱。但是,從客戶端訪問存儲在 Informix 服務器上的數據同樣依賴于硬件和操作系統的性能。Informix 提供了許多技術來保證數據訪問的性能和可靠性,比如包含連接管理器的 MACH-11、自動數據庫統計更新等。但是,本文主要介紹 Informix 如何處理某些由無法預測的隨機系統事件所引起的異常場景,這些事件可能會導致數據庫操作花費比預期更長的時間,其中包括緩慢的網絡速度、意外的系統負載過重、TCP 包的丟失或其他無法預見的事件。
在很多時候,Informix 客戶端會使用阻塞模式 中的 TCP 套接字與 Informix 服務器進行通信,這意味著客戶端會一直等到有可用的服務器數據來實現通信。對于緩慢的連接請求,您可以中斷并重試該請求,其方法是基于您的正常系統行為,將 Informix 環境變量 INFORMIXCONTIME 和 INFORMIXCONRETRY 設置為合適的值。
在數據庫服務器執行一個 SQL 請求時,在來自數據庫服務器的預期響應可供讀取之前,應用程序會被阻塞。有時您可能想要中斷一個 SQL 請求來獲得應用程序控制權,因為您不想等到當前 SQL 語句完成操作。例如,如果您無意之中為一個長查詢提供了錯誤的搜索條件,您想取消 SELECT 語句,而不是等待不需要的數據。如果它是一個多層應用程序,那么情況可能更糟。Informix 客戶端(包括 CSDK 和 JDBC)允許用戶在執行中中斷 SQL 請求。應用程序的設計和實現需要提供用戶取消 SQL 請求的支持。
如果運行的應用程序是來自第三方供應商,那么若該應用程序中沒有相關選項,會很難中斷 SQL 請求。為了處理此情形,Informix 在最新的客戶端版本中引入了一項新功能,支持您在 Informix 客戶端中啟用 TCP 套接字超時,以便中斷請求而無需更改任何代碼。
本文中所列出的樣例程序都進行了簡化,僅用于演示用途。
Informix 連接超時
概述
連接到一個 Informix 數據庫通常只需不到一秒到幾秒的時間(具體取決于網絡速度),但有時它所花的時間比預期更長。INFORMIXCONTIME 和 INFORMIXCONRETRY 是兩個可控制連接行為的客戶端環境變量。
INFORMIXCONTIME
INFORMIXCONTIME 環境變量指定在每次嘗試建立數據庫服務器連接時,數據庫連接請求會持續幾秒鐘才返回一個錯誤。如果 INFORMIXCONTIME 環境變量設置為 0 或一個小于 0 的值,那么數據庫連接請求將等到該操作成功或失敗。如果沒有對其變量進行設置,那么各個系統中的默認值可能會有所不同:
- ESQL/C:INFORMIXCONTIME 的默認值設置為 60 秒。您可以在 OS 環境中使用 OS 命令為 ESQL/C 程序設置 INFORMIXCONTIME 環境變量。
- UNIX?/Linux?:使用 export 或 setenv 命令,具體取決于 shell。
- Windows?:Set 命令或控制面板。
- ODBC:它默認設置為 15 秒。相反,您可使用此 SQL_ATTR_LOGIN_TIMEOUT 連接屬性指定連接請求的連接超時間隔。如果同時設置了 INFORMIXCONTIME 和 SQL_ATTR_LOGIN_TIMEOUT,則 SQL_ATTR_LOGIN_TIMEOUT 連接屬性會具有更高的優先級。
- OLEDB 和 .NET:默認值為 15 秒。您可為 Informix OLEDB 提供程序設置 INFORMIXCONTIME 環境變量,但這不適用于使用 IfxConnection.ConnectionTimeout 屬性來設置連接超時的 Informix .NET 提供程序。
- JDBC:默認值為 0,表示連接從不超時??梢栽?JDBC 連接 URL 或 JDBC DataSource 連接屬性中設置 INFORMIXCONTIME 環境變量。JDBC 3.70.JC1 引入了另一個名為 LOGINTIMEOUT 的環境變量??墒褂盟付ㄝ喸兎掌鞫丝趤斫⑦B接的時間段(以毫秒為單位)。如果應用程序沒有在指定時間內連接到 Informix 數據庫服務器,將返回一個錯誤。它只能設置為一個 DataSource 屬性。在 JDBC 連接 URL 中對它進行設置將不會生效。
您可以基于正常應用程序行為將 INFORMIXCONTIME 環境變量設置為合適的值。
如果連接請求涉及到搜索 DBPATH,則可能看到連接請求所花的時間長于 INFORMIXCONTIME 限制,以至于返回了一個錯誤。如果 DBPATH 包含多個服務器,那么 INFORMIXCONTIME 值需要除以 DBPATH 中包含的服務器條目數量。在此情況下,您應相應地增加 INFORMIXCONTIME 值。
INFORMIXCONRETRY
INFORMIXCONRETRY 環境變量指定客戶端在 INFORMIXCONTIME 所指定的時間限制內客戶端應對每個數據庫服務器執行的連接嘗試總數。例如,如果 INFORMIXCONTIME 設置為 30 秒并且 INFORMIXCONRETRY 設置為 2,那么若初始連接嘗試無法實現,客戶端將嘗試在第 15 秒時重新發送連接請求。在終止之前,如果需要,它將在第 30 秒時進行另一次連接嘗試。
在 CSDK 和 JDBC 3.70.xC1 以前,INFORMIXCONRETRY 環境變量的默認值為 3。從 JDBC 3.70.xC1 開始,新的默認值為 1,這意味著在初始連接嘗試之后僅進行一次重試。