術語
在討論 DB2 對 32 位和 64 位的支持之前,首先將查看並理解本文的上下文中牽涉到的一些術語和重要概念,這十分重要:
簡介
您是否計劃將數據庫客戶機或服務器遷移到 64 位平台,或者只是想構建和部署適合 64 位 DB2 實例的應用程序或例程,那麼理解 DB2 對 32 位和 64 位應用程序開發的支持十分重要。同樣重要的是,采用一些最佳實踐有助於應用程序和例程的部署,並確保它們在目標環境中的功能與預期的一致。
本文分為三部分:首先將向您介紹 32 位和 64 位對象的概念,然後幫助您了解有關 32 位和 64 位 DB2 配置和特性支持的信息,最後幫助您制定出用於開發和部署適合 64 位 DB2 實例的應用程序的策略。
第 I 部分:32 位和 64 位對象概述
廣泛理解 32 位和 64 位對象在計算環境中的相關性十分重要,因為它們之間的某些依賴性可能影響到各個方面,包括所需購買的硬件,部署應用程序的方式等。
32 位和 64 位硬件
32 位計算機硬件使用 32 位來表示內存地址以及處理指令和數據。64 位硬件使用 64 位來做同樣的事情。通常,32 位操作系統運行在 32 位的硬件上,而 64 位操作系統則運行在 64 位的硬件上,不過在某些 64 位的硬件上運行 32 位操作系統也是可能的。
32 位和 64 位操作系統
操作系統由一個內核和一組操作系統庫組成,其中內核直接與硬件打交道。操作系統要麼帶有 32 位的內核,要麼帶有 64 位的內核,或者,在某些情況下同時帶有這兩種內核。通常,32 位操作系統內核可以使用 4 GB 的實際內存即操作系統和正在運行的應用程序共享的物理 RAM),而 64 位操作系統內核可以使用更多的實際內存。當然,有些 32 位操作系統內核可以使用多於 4 GB 的內存,但是在這一點上仍然不如 64 位的內核。在某些操作系統上,可能必須有 64 位內核來運行 64 位應用程序,因為這種應用程序在使用 32 位內核的情況下是不能運行的。所有 UNIX® 操作系統都屬於這種情況,只有 AIX® 例外。在 AIX 上,情況十分特殊,您可以任意使用 32 位或 64 位內核來運行 32 位和 64 位應用程序。然而,為了防止可伸縮性問題,在運行 32 位應用程序時最好使用 64 位內核。
操作系統庫很重要,因為有了這些系統庫才能構建和運行應用程序。為了構建 32 位應用程序,必須鏈接 32 位系統庫。同樣,為了構建 64 位應用程序,必須有 64 位系統庫。不過,在一個特定的操作系統中,即使提供了 64 位系統庫,也不一定意味著這個系統真正可以運行 64 位應用程序。這種情況對於 32 位 Windows® 操作系統更是常見,在 32 位 Windows 上,雖然有些 64 位應用程序不能運行,但是可以編譯和鏈接它們。對於 UNIX 平台也是如此,因為在某些情況下,您可以在 32 位的硬件上安裝帶 64 位支持的操作系統,還有一些情況下,32 位內核不能運行 64 位應用程序。實際上,可以把 32 位操作系統看作只能運行 32 位應用程序的操作系統,盡管 64 位操作系統也能運行 64 位應用程序,但需要使用 64 位硬件,而且可能還需要使用 64 位操作系統內核。
32 位和 64 位應用程序
32 位應用程序是按照內存地址的大小為 32 位4 個字節)來編譯的。這些應用程序可以直接使用至多 4 GB 的虛擬內存 —— 即一台計算機上可以提供的潛在內存。不管系統上可用於操作系統和其他應用程序之間共享的實際內存RAM)有多少,這一虛擬內存限制始終存在。另一方面, 64 位應用程序按照內存為 64 位8 個字節)來編譯,可以使用多於 4 GB 的虛擬內存,這不受限制。操作系統通常還會對應用程序施加更多的虛擬內存限制,因此,雖然應用程序具有 32 位的尋址能力,但理論上每個應用程序的最大虛擬內存可能只有 1-2 GB。
當您在 32 位或 64 位平台上編譯應用程序時,默認情況下應用程序被編譯為在某種特定平台上運行。通過使用特殊的特定於編譯器的編譯選項,並適當地鏈接到合適的 32 位或 64 位庫,也可以在帶有某些編譯器的 32 位操作系統上創建 64 位應用程序,或者在 64 位操作系統上創建 32 位應用程序。
32 位應用程序通常可以同時在 32 位和 64 位操作系統上運行,不過在很多采用 32 位內核的操作系統上不能運行 64 位應用程序。
DB2 32 位和 64 位對象概述
從 DB2 的角度來看,當然也存在 32 位和 64 位的 DB2 對象。32 位和 64 位 DB2 實例就是其中的一個例子。您可以在 32 位或 64 位操作系統上創建 32 位 DB2 實例,但是只能在 64 位操作系統上創建 64 位 DB2 實例。有些混合 32 位和 64 位操作系統,例如 AIX Version 5.1,便支持這兩種類型的 DB2 實例。同一個數據庫服務器上可以存在多個 DB2 實例,以服務不同的用戶需求測試實例與生成實例),並且不一定要有相同的位數。
DB2 應用程序可以同時在具有大多數編譯器的 32 位和 64 位 DB2 實例中創建為 32 位或 64 位的對象,但是為了得到應有的功能,必須將 32 位或 64 位 DB2 應用程序分別鏈接到 DB2 的 32 位和 64 位庫,兩種 DB2 實例都提供了這樣的庫。
32 位 DB2 外部例程是在被調用時裝載和運行 32 位外部庫的 DB2 外部例程過程,用戶定義函數)。在調用 64 位外部例程時,則裝載和運行 64 位外部庫。
對 32 位和 64 位對象之間的關系有了基本的理解之後,就更容易明白必須如何管理 DB2 應用程序開發實踐,以便系統可以支持 32 位和 64 位應用程序的開發和部署。
第 II 部分:DB2 32 位和 64 位應用程序和例程支持
就 32 位和 64 位跨平台開發而言,DB2 UDB 確實是一種通用的數據庫。沒有哪種數據庫像 DB2 那樣,為在如此多的平台上開發和部署應用程序提供了如此多的支持。談到 32 位和 64 位應用程序的開發支持,DB2 走在了前列。下面的小節將介紹 DB2 的關鍵 32 位和 64 位平台和應用程序開發支持。
受支持的 32 位和 64 位 DB2 UDB 產品
下面的 Linux、UNIX 和 Windows 平台上的 DB2 Universal Database 產品在 32 位和 64 位平台上都可以使用:
表 1. DB2 受支持的 32 位和 64 位軟件
您可以使用 Personal Developer’s Edition 或任何其他產品開發數據庫應用程序,前提是在客戶機上安裝了 DB2 Application Development Client。
要了解更多關於 DB2 產品、擴展器、工具以及其他信息管理軟件產品的信息,請參閱 http://www.ibm.com/software/data/db2/udb。
受支持的 32 位和 64 位平台
一旦確定了哪種 DB2 產品能滿足您的需要,就必須為數據庫系統選擇硬件。下面的表列出了可用作 DB2 數據庫服務器或 DB2 客戶機的受支持的 32 位和 64 位平台。.
表 2. 受支持的平台
有很多因素可能影響對用於開發和測試系統或生產系統的平台的選擇。通常,這種決定最終歸結為價格、性能、可伸縮性和可靠性。當需要為了數據庫服務器在 32 位或 64 位硬件平台作出選擇時,應該考慮使用 64 位平台的以下優點:
通常,生產系統的效率對於數據管理策略的成功十分關鍵,這就是為什麼常常在生產系統中使用更快的 64 位硬件作為數據庫服務器的原因。
如果單獨運行開發、測試和生產系統,那麼顯然當開發和生產系統在相同的平台上,或者至少運行相同的操作系統時,應用程序的部署是最容易的。
DB2 32 位和 64 位數據庫連接支持
您可以混合和匹配選作 DB2 數據庫客戶機和服務器的平台,因為 DB2 支持從 32 位和 64 位客戶機到數據庫服務器的本地和遠程連接。
本地數據庫連接用於將 DB2 客戶機或客戶機應用程序連接到與客戶機駐留在同一台計算機上的 DB2 數據庫服務器,而不需要網絡協議。另一方面,遠程數據庫連接是連接到駐留在不同計算機上的 DB2 數據庫服務器,因而需要 TCPIP 之類的網絡協議。下面的表展示了 DB2 對 32 位和 64 位客戶機與 32 位和 64 位 DB2 數據庫服務器之間本地和遠程連接的全部支持。
表 3. DB2 對從 32 位和 64 位客戶機到 32 位和 64 位服務器的支持
如果 DB2 客戶機和 DB2 數據庫服務器在不同類型的平台上,那麼這種廣泛的支持是一個重要特性。這還意味著 32 位和 64 位應用程序可以連接 32 位和 64 位數據庫服務器上的數據庫並與這些數據庫通信。
要獲得對 DB2 受支持的 32 位和 64 位硬件以及用於 DB2 Versions 7 和 8 的客戶機-服務器配置的詳細描述,請參閱主題 “Supported and non-supported client configurations”,在 DB2 Quick Beginnings Guide (PDF) 和 Information Center (HTML) 中都可以找到這個主題。
DB2 的 32 位和 64 位客戶機應用程序支持
DB2 支持用於各個受支持平台的多種編譯器、解釋器和相關開發軟件。您可以在 32 位或 64 位 DB2 實例中的任何一種 DB2 實例中構建 DB2 32 位和 64 位應用程序,只要該 DB2 實例中帶有前面提到的差不多所有 DB2 都支持的編譯器,這些編譯器提供了 32 位和 64 位應用程序編譯支持。
在開始編寫應用程序之前,應確認您所想要的編譯器或開發軟件能夠支持 32 位和 64 位應用程序的開發需要。要獲得關於用於各種硬件平台的 DB2 受支持的開發軟件的詳細描述,請參閱主題 “Supported development software”,在 DB2 Application Development Guide: Building and Running Applications (PDF) 和 Information Center (HTML) 中都可以找到這個主題。
在構建和鏈接 32 位或 64 位 DB2 應用程序之前,最好要確切地知道將來可以在哪裡運行這些應用程序。下面的表展示了可以在其上運行 DB2 32 位和 64 位客戶機應用程序的硬件和操作系統,這裡假設這些應用程序被正確地編譯和鏈接:
表 4. DB2 對於 32 位和 64 位平台上 32 位和 64 位應用程序的運行時支持
(1) Windows 32 位應用程序可以在 Windows 64 位平台上運行,而不需要對環境作任何改變。在 UNIX 上,通過重新綁定應用程序並以適當的庫路徑設置運行應用程序,便可以將已有的 32 位應用程序部署到所有 64 位平台上,只有 Linux IA64 和 Linux for zSeries® 例外。
關於如何正確地構建、鏈接和鏈接要部署到不同平台的應用程序的建議,將在本文的 第 III 部分 中詳細討論。
DB2 的 32 位和 64 位例程支持
例程存儲過程、UDF 和方法)不同於應用程序。例程 – 封裝了數據庫和編程邏輯的數據庫對象 - 運行在數據庫服務器上,是通過執行特定於例程的 CREATE 語句創建的,該語句定義了例程的一些特征。
SQL 例程支持
對於 DB2 Version 8.2,SQL 過程定義像 SQL 函數、表、觸發器和其他數據庫對象定義一樣,完全保存在數據庫中。SQL 過程不再與任何駐留在數據庫服務器上的可執行代碼產生關聯,這意味著不存在與 SQL 例程的創建、調用、部署或遷移有關聯的 32 位或 64 位相關因素。
外部例程支持
外部例程的例程體是以一種編程語言編寫的,它被編譯成一個庫,當例程被調用時,就要裝載並運行這個庫。在 CREATE 語句中有兩個子句用於外部例程,它們是 FENCED 和 NOT FENCED,這兩個子句將決定外部例程是在一個不同於數據庫管理器的 fenced 環境中運行,還是在與數據庫管理器相同的尋址空間中運行。通常,unfenced 例程比 fenced 例程執行起來要更好一些,因為它們通過共享內存與數據庫管理器通信,而不是通過 TCPIP 通信。默認情況下,不管 CREATE 語句中使用了哪些其他的子句,例程總是被創建為 fenced 例程。
下面的表說明了 DB2 對在運行相同操作系統的 32 位和 64 位數據庫服務器上運行 fenced 和 unfenced 32 位和 64 位例程的支持:
表 5. DB2 對在 32 位和 64 位服務器上運行過程和 UDF 的支持
(1) 在 64 位服務器上運行 32 位例程不如在 64 位服務器上運行 64 位例程那麼快。
(2) 32 位例程必須創建為 FENCED 和 NOT THREADSAFE 才能在 64 位服務器上運行。
(3) 在 Linux IA 64 位數據庫服務器上不能調用 32 位例程。
(4) 64 位應用程序和例程不能在 32 位尋找空間中運行。
在表 5 中要注意的重要一點是,32 位 unfenced 過程不能在 64 位 DB2 服務器上運行。如果必須將 32 位 unfenced 例程部署到 64 位平台,那麼應該在編目這些例程之前將 NOT FENCED 子句從用於這些例程的 CREATE 語句中去掉。
32 位和 64 位外部例程解析
當執行引用例程的 SQL 語句例如用於調用過程的 CALL 語句或者可以在 select 列表中包含列函數的 SELECT 查詢)時,DB2 根據 DB2 系統編目表中的例程定義解析例程引用,並在 SQL 語句的執行過程中調用例程。
當調用外部例程時,DB2 根據名稱在數據庫服務器上找到例程的外部類或庫文件,然後裝載並運行外部類或庫文件。在 32 位平台上,外部例程總是作為 32 位對象來裝載和運行。在 64 位平台上,出於性能考慮,DB2 假設例程調用的目標庫是 64 位的對象。因此,DB2 首先嘗試作為 64 位的對象來執行例程的外部庫或類。如果不行的話,DB2 便自動嘗試作為 32 位 fenced 例程庫來裝載和運行該庫。
如果在數據庫服務器的文件系統中同時具有一個例程的庫或類的 32 位和 64 位版本,那麼為了得到最佳性能,應該確保該例程的 CREATE 語句標識了正確的外部庫或類文件,而不是讓 DB2 去搜索正確的版本來運行。
要了解關於例程解析和調用的更多信息,請參閱 Routine invocation —— 一個 IBM DB2 文檔主題。
64 位數據庫服務器上 32 位外部例程的性能
由於對實現外部例程的選擇常常基於提高客戶機應用程序性能的需要,因此從外部例程中獲得最大性能通常被優先考慮。在 64 位數據庫服務器上,外部例程的性能部分上是由外部例程是裝載 32 位還是 64 位外部例程庫來決定的。
除了 Java™ 例程以外,在 64 位服務器上調用 32 位例程在性能上不如在 64 位服務器上調用 64 位例程,因為出於性能考慮,DB2 首先嘗試將例程當作 64 位對象來執行,然後才嘗試將例程作為 32 位對象來執行,而後者要求特殊的 32 位 fenced 模式處理。對於單獨的 32 位例程調用,其開銷顯得微不足道,但是當這個例程被調用很多次時,開銷就變得比較顯著了。如果您關心性能的話,那麼建議您重新構建編譯、綁定和鏈接)例程源代碼來創建 64 位例程庫。