小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

使用 DB2 UDB V8.2 進(jìn)行 32 位和 64 位應(yīng)用程序開發(fā)

 hx99 2007-09-08

Gwyneth Evans (grevans@ca.ibm.com), 軟件開發(fā)人員, IBM Canada, Inc.

2004 年 11 月 01 日

如果您要從 32 位 DB2® 實(shí)例遷移到 64 位 DB2 實(shí)例,或者將 32 位應(yīng)用程序部署到 64 位的平臺(tái)上,抑或只是想以后能夠很容易實(shí)現(xiàn)這種遷移,那么本文很適合您。本文將概述 DB2 Universal Database™(DB2 UDB) 的 32 位和 64 位應(yīng)用程序以及例程,同時(shí)還將解釋有關(guān)開發(fā) DB2 應(yīng)用程序和例程以及將它們部署到 64 位平臺(tái)的一些考慮事項(xiàng)及最佳實(shí)踐。

術(shù)語

在討論 DB2 對 32 位和 64 位的支持之前,首先將查看并理解本文的上下文中牽涉到的一些術(shù)語和重要概念,這十分重要:

  • 平臺(tái):計(jì)算機(jī)硬件和操作系統(tǒng)的基本技術(shù),定義了計(jì)算機(jī)如何運(yùn)行,以及可以在它上面運(yùn)行什么樣的軟件。
  • 硬件:計(jì)算機(jī)以及它的相關(guān)架構(gòu)。
  • 操作系統(tǒng): 控制計(jì)算機(jī)硬件并允許其他應(yīng)用程序和用戶使用計(jì)算機(jī)的軟件。操作系統(tǒng)由一個(gè)內(nèi)核和一組操作系統(tǒng)庫組成,其中內(nèi)核直接與硬件打交道,而那些操作系統(tǒng)庫則是構(gòu)建和運(yùn)行應(yīng)用程序所必需的。
  • DB2 實(shí)例:一個(gè)邏輯數(shù)據(jù)庫服務(wù)器環(huán)境,DB2 數(shù)據(jù)庫就是在該環(huán)境中創(chuàng)建的。
  • 數(shù)據(jù)庫客戶機(jī):向數(shù)據(jù)庫服務(wù)器請求訪問數(shù)據(jù)庫對象和數(shù)據(jù)、運(yùn)行應(yīng)用程序或者請求基于應(yīng)用程序的服務(wù)的計(jì)算機(jī)或軟件程序。
  • 數(shù)據(jù)庫服務(wù)器:計(jì)算機(jī)或程序,包含并管理數(shù)據(jù)庫,同時(shí)處理客戶機(jī)發(fā)出的對數(shù)據(jù)庫數(shù)據(jù)的請求。
  • 32 位:一臺(tái)計(jì)算機(jī)可以并行處理的二進(jìn)制數(shù)字的個(gè)數(shù)(bit),或者表示內(nèi)存尋址。例如,一臺(tái) 32 位的計(jì)算機(jī)有 32 位寬的數(shù)據(jù)寄存器,并使用 32 位來標(biāo)識(shí)內(nèi)存中的每個(gè)地址。
  • 64 位:參見 32 位。一臺(tái) 64 位的計(jì)算機(jī)有 64 位寬的數(shù)據(jù)寄存器,并使用 64 位來標(biāo)識(shí)內(nèi)存中的每個(gè)地址。




回頁首


簡介

您是否計(jì)劃將數(shù)據(jù)庫客戶機(jī)或服務(wù)器遷移到 64 位平臺(tái),或者只是想構(gòu)建和部署適合 64 位 DB2 實(shí)例的應(yīng)用程序或例程,那么理解 DB2 對 32 位和 64 位應(yīng)用程序開發(fā)的支持十分重要。同樣重要的是,采用一些最佳實(shí)踐有助于應(yīng)用程序和例程的部署,并確保它們在目標(biāo)環(huán)境中的功能與預(yù)期的一致。

本文分為三部分:首先將向您介紹 32 位和 64 位對象的概念,然后幫助您了解有關(guān) 32 位和 64 位 DB2 配置和特性支持的信息,最后幫助您制定出用于開發(fā)和部署適合 64 位 DB2 實(shí)例的應(yīng)用程序的策略。





回頁首


第 I 部分:32 位和 64 位對象概述

廣泛理解 32 位和 64 位對象在計(jì)算環(huán)境中的相關(guān)性十分重要,因?yàn)樗鼈冎g的某些依賴性可能影響到各個(gè)方面,包括所需購買的硬件,部署應(yīng)用程序的方式等。

32 位和 64 位硬件

32 位計(jì)算機(jī)硬件使用 32 位來表示內(nèi)存地址以及處理指令和數(shù)據(jù)。64 位硬件使用 64 位來做同樣的事情。通常,32 位操作系統(tǒng)運(yùn)行在 32 位的硬件上,而 64 位操作系統(tǒng)則運(yùn)行在 64 位的硬件上,不過在某些 64 位的硬件上運(yùn)行 32 位操作系統(tǒng)也是可能的。

32 位和 64 位操作系統(tǒng)

操作系統(tǒng)由一個(gè)內(nèi)核和一組操作系統(tǒng)庫組成,其中內(nèi)核直接與硬件打交道。操作系統(tǒng)要么帶有 32 位的內(nèi)核,要么帶有 64 位的內(nèi)核,或者,在某些情況下同時(shí)帶有這兩種內(nèi)核。通常,32 位操作系統(tǒng)內(nèi)核可以使用 4 GB 的實(shí)際內(nèi)存(即操作系統(tǒng)和正在運(yùn)行的應(yīng)用程序共享的物理 RAM),而 64 位操作系統(tǒng)內(nèi)核可以使用更多的實(shí)際內(nèi)存。當(dāng)然,有些 32 位操作系統(tǒng)內(nèi)核可以使用多于 4 GB 的內(nèi)存,但是在這一點(diǎn)上仍然不如 64 位的內(nèi)核。在某些操作系統(tǒng)上,可能必須有 64 位內(nèi)核來運(yùn)行 64 位應(yīng)用程序,因?yàn)檫@種應(yīng)用程序在使用 32 位內(nèi)核的情況下是不能運(yùn)行的。所有 UNIX® 操作系統(tǒng)都屬于這種情況,只有 AIX® 例外。在 AIX 上,情況十分特殊,您可以任意使用 32 位或 64 位內(nèi)核來運(yùn)行 32 位和 64 位應(yīng)用程序。然而,為了防止可伸縮性問題,在運(yùn)行 32 位應(yīng)用程序時(shí)最好使用 64 位內(nèi)核。

操作系統(tǒng)庫很重要,因?yàn)橛辛诉@些系統(tǒng)庫才能構(gòu)建和運(yùn)行應(yīng)用程序。為了構(gòu)建 32 位應(yīng)用程序,必須鏈接 32 位系統(tǒng)庫。同樣,為了構(gòu)建 64 位應(yīng)用程序,必須有 64 位系統(tǒng)庫。不過,在一個(gè)特定的操作系統(tǒng)中,即使提供了 64 位系統(tǒng)庫,也不一定意味著這個(gè)系統(tǒng)真正可以運(yùn)行 64 位應(yīng)用程序。這種情況對于 32 位 Windows® 操作系統(tǒng)更是常見,在 32 位 Windows 上,雖然有些 64 位應(yīng)用程序不能運(yùn)行,但是可以編譯和鏈接它們。對于 UNIX 平臺(tái)也是如此,因?yàn)樵谀承┣闆r下,您可以在 32 位的硬件上安裝帶 64 位支持的操作系統(tǒng),還有一些情況下,32 位內(nèi)核不能運(yùn)行 64 位應(yīng)用程序。實(shí)際上,可以把 32 位操作系統(tǒng)看作只能運(yùn)行 32 位應(yīng)用程序的操作系統(tǒng),盡管 64 位操作系統(tǒng)也能運(yùn)行 64 位應(yīng)用程序,但需要使用 64 位硬件,而且可能還需要使用 64 位操作系統(tǒng)內(nèi)核。

32 位和 64 位應(yīng)用程序

32 位應(yīng)用程序是按照內(nèi)存地址的大小為 32 位(4 個(gè)字節(jié))來編譯的。這些應(yīng)用程序可以直接使用至多 4 GB 的虛擬內(nèi)存 —— 即一臺(tái)計(jì)算機(jī)上可以提供的潛在內(nèi)存。不管系統(tǒng)上可用于操作系統(tǒng)和其他應(yīng)用程序之間共享的實(shí)際內(nèi)存(RAM)有多少,這一虛擬內(nèi)存限制始終存在。另一方面,64 位應(yīng)用程序按照內(nèi)存為 64 位(8 個(gè)字節(jié))來編譯,可以使用多于 4 GB 的虛擬內(nèi)存,這不受限制。操作系統(tǒng)通常還會(huì)對應(yīng)用程序施加更多的虛擬內(nèi)存限制,因此,雖然應(yīng)用程序具有 32 位的尋址能力,但理論上每個(gè)應(yīng)用程序的最大虛擬內(nèi)存可能只有 1-2 GB。

當(dāng)您在 32 位或 64 位平臺(tái)上編譯應(yīng)用程序時(shí),默認(rèn)情況下應(yīng)用程序被編譯為在某種特定平臺(tái)上運(yùn)行。通過使用特殊的特定于編譯器的編譯選項(xiàng),并適當(dāng)?shù)劓溄拥胶线m的 32 位或 64 位庫,也可以在帶有某些編譯器的 32 位操作系統(tǒng)上創(chuàng)建 64 位應(yīng)用程序,或者在 64 位操作系統(tǒng)上創(chuàng)建 32 位應(yīng)用程序。

32 位應(yīng)用程序通常可以同時(shí)在 32 位和 64 位操作系統(tǒng)上運(yùn)行,不過在很多采用 32 位內(nèi)核的操作系統(tǒng)上不能運(yùn)行 64 位應(yīng)用程序。

DB2 32 位和 64 位對象概述

從 DB2 的角度來看,當(dāng)然也存在 32 位和 64 位的 DB2 對象。32 位和 64 位 DB2 實(shí)例就是其中的一個(gè)例子。您可以在 32 位或 64 位操作系統(tǒng)上創(chuàng)建 32 位 DB2 實(shí)例,但是只能在 64 位操作系統(tǒng)上創(chuàng)建 64 位 DB2 實(shí)例。有些混合 32 位和 64 位操作系統(tǒng),例如 AIX Version 5.1,便支持這兩種類型的 DB2 實(shí)例。同一個(gè)數(shù)據(jù)庫服務(wù)器上可以存在多個(gè) DB2 實(shí)例,以服務(wù)不同的用戶需求(測試實(shí)例與生成實(shí)例),并且不一定要有相同的位數(shù)。

DB2 應(yīng)用程序可以同時(shí)在具有大多數(shù)編譯器的 32 位和 64 位 DB2 實(shí)例中創(chuàng)建為 32 位或 64 位的對象,但是為了得到應(yīng)有的功能,必須將 32 位或 64 位 DB2 應(yīng)用程序分別鏈接到 DB2 的 32 位和 64 位庫,兩種 DB2 實(shí)例都提供了這樣的庫。

32 位 DB2 外部例程是在被調(diào)用時(shí)裝載和運(yùn)行 32 位外部庫的 DB2 外部例程(過程,用戶定義函數(shù))。在調(diào)用 64 位外部例程時(shí),則裝載和運(yùn)行 64 位外部庫。

對 32 位和 64 位對象之間的關(guān)系有了基本的理解之后,就更容易明白必須如何管理 DB2 應(yīng)用程序開發(fā)實(shí)踐,以便系統(tǒng)可以支持 32 位和 64 位應(yīng)用程序的開發(fā)和部署。





回頁首


第 II 部分:DB2 32 位和 64 位應(yīng)用程序和例程支持

就 32 位和 64 位跨平臺(tái)開發(fā)而言,DB2 UDB 確實(shí)是一種通用的數(shù)據(jù)庫。沒有哪種數(shù)據(jù)庫像 DB2 那樣,為在如此多的平臺(tái)上開發(fā)和部署應(yīng)用程序提供了如此多的支持。談到 32 位和 64 位應(yīng)用程序的開發(fā)支持,DB2 走在了前列。下面的小節(jié)將介紹 DB2 的關(guān)鍵 32 位和 64 位平臺(tái)和應(yīng)用程序開發(fā)支持。

受支持的 32 位和 64 位 DB2 UDB 產(chǎn)品

下面的 Linux、UNIX 和 Windows 平臺(tái)上的 DB2 Universal Database 產(chǎn)品在 32 位和 64 位平臺(tái)上都可以使用:

表 1. DB2 受支持的 32 位和 64 位軟件

DB2 產(chǎn)品
DB2 UDB Express Edition
DB2 UDB Personal Edition
DB2 UDB Personal Developer’s Edition
DB2 UDB Developer’s Edition
DB2 UDB Workgroup Server Edition
DB2 UDB Workgroup Server Unlimited Edition
DB2 UDB Enterprise Server Edition

您可以使用 Personal Developer’s Edition 或任何其他產(chǎn)品開發(fā)數(shù)據(jù)庫應(yīng)用程序,前提是在客戶機(jī)上安裝了 DB2 Application Development Client。

要了解更多關(guān)于 DB2 產(chǎn)品、擴(kuò)展器、工具以及其他信息管理軟件產(chǎn)品的信息,請參閱 http://www.ibm.com/software/data/db2/udb。

受支持的 32 位和 64 位平臺(tái)

一旦確定了哪種 DB2 產(chǎn)品能滿足您的需要,就必須為數(shù)據(jù)庫系統(tǒng)選擇硬件。下面的表列出了可用作 DB2 數(shù)據(jù)庫服務(wù)器或 DB2 客戶機(jī)的受支持的 32 位和 64 位平臺(tái)。.

表 2. 受支持的平臺(tái)

32 位平臺(tái) 64 位平臺(tái) 混合平臺(tái)
AIX AIX AIX hybrid (5.1)
HP PARSIC HP PARSIC
HP IPF HP IPF
Linux Intel 32 位 Linux AMD
Linux PPC Linux EMt64
Linux zSeries Linux Itanium 64 位 (IA64)
Solaris Linux PPC
Windows 32 位 Linux zSeries
Solaris
Windows IA64

有很多因素可能影響對用于開發(fā)和測試系統(tǒng)或生產(chǎn)系統(tǒng)的平臺(tái)的選擇。通常,這種決定最終歸結(jié)為價(jià)格、性能、可伸縮性和可靠性。當(dāng)需要為了數(shù)據(jù)庫服務(wù)器在 32 位或 64 位硬件平臺(tái)作出選擇時(shí),應(yīng)該考慮使用 64 位平臺(tái)的以下優(yōu)點(diǎn):

  • 可以有更多的內(nèi)存用于構(gòu)建和運(yùn)行更大的應(yīng)用程序。
  • 更有效的數(shù)據(jù)處理和更好的應(yīng)用程序性能。

通常,生產(chǎn)系統(tǒng)的效率對于數(shù)據(jù)管理策略的成功十分關(guān)鍵,這就是為什么常常在生產(chǎn)系統(tǒng)中使用更快的 64 位硬件作為數(shù)據(jù)庫服務(wù)器的原因。

如果單獨(dú)運(yùn)行開發(fā)、測試和生產(chǎn)系統(tǒng),那么顯然當(dāng)開發(fā)和生產(chǎn)系統(tǒng)在相同的平臺(tái)上,或者至少運(yùn)行相同的操作系統(tǒng)時(shí),應(yīng)用程序的部署是最容易的。

DB2 32 位和 64 位數(shù)據(jù)庫連接支持

您可以混合和匹配選作 DB2 數(shù)據(jù)庫客戶機(jī)和服務(wù)器的平臺(tái),因?yàn)?DB2 支持從 32 位和 64 位客戶機(jī)到數(shù)據(jù)庫服務(wù)器的本地和遠(yuǎn)程連接。

本地?cái)?shù)據(jù)庫連接用于將 DB2 客戶機(jī)或客戶機(jī)應(yīng)用程序連接到與客戶機(jī)駐留在同一臺(tái)計(jì)算機(jī)上的 DB2 數(shù)據(jù)庫服務(wù)器,而不需要網(wǎng)絡(luò)協(xié)議。另一方面,遠(yuǎn)程數(shù)據(jù)庫連接是連接到駐留在不同計(jì)算機(jī)上的 DB2 數(shù)據(jù)庫服務(wù)器,因而需要 TCPIP 之類的網(wǎng)絡(luò)協(xié)議。下面的表展示了 DB2 對 32 位和 64 位客戶機(jī)與 32 位和 64 位 DB2 數(shù)據(jù)庫服務(wù)器之間本地和遠(yuǎn)程連接的全部支持。

表 3. DB2 對從 32 位和 64 位客戶機(jī)到 32 位和 64 位服務(wù)器的支持

DB2 客戶機(jī) 32 位 DB2 服務(wù)器(本地和遠(yuǎn)程) 64 位 DB2 服務(wù)器(本地和遠(yuǎn)程)
32 位客戶機(jī) 支持 支持 (1)
64 位客戶機(jī) 支持 支持

如果 DB2 客戶機(jī)和 DB2 數(shù)據(jù)庫服務(wù)器在不同類型的平臺(tái)上,那么這種廣泛的支持是一個(gè)重要特性。這還意味著 32 位和 64 位應(yīng)用程序可以連接 32 位和 64 位數(shù)據(jù)庫服務(wù)器上的數(shù)據(jù)庫并與這些數(shù)據(jù)庫通信。

要獲得對 DB2 受支持的 32 位和 64 位硬件以及用于 DB2 Versions 7 和 8 的客戶機(jī)-服務(wù)器配置的詳細(xì)描述,請參閱主題 “Supported and non-supported client configurations”,在 DB2 Quick Beginnings Guide (PDF) 和 Information Center (HTML) 中都可以找到這個(gè)主題。

DB2 的 32 位和 64 位客戶機(jī)應(yīng)用程序支持

DB2 支持用于各個(gè)受支持平臺(tái)的多種編譯器、解釋器和相關(guān)開發(fā)軟件。您可以在 32 位或 64 位 DB2 實(shí)例中的任何一種 DB2 實(shí)例中構(gòu)建 DB2 32 位和 64 位應(yīng)用程序,只要該 DB2 實(shí)例中帶有前面提到的差不多所有 DB2 都支持的編譯器,這些編譯器提供了 32 位和 64 位應(yīng)用程序編譯支持。

在開始編寫應(yīng)用程序之前,應(yīng)確認(rèn)您所想要的編譯器或開發(fā)軟件能夠支持 32 位和 64 位應(yīng)用程序的開發(fā)需要。要獲得關(guān)于用于各種硬件平臺(tái)的 DB2 受支持的開發(fā)軟件的詳細(xì)描述,請參閱主題 “Supported development software”,在 DB2 Application Development Guide: Building and Running Applications (PDF) 和 Information Center (HTML) 中都可以找到這個(gè)主題。

在構(gòu)建和鏈接 32 位或 64 位 DB2 應(yīng)用程序之前,最好要確切地知道將來可以在哪里運(yùn)行這些應(yīng)用程序。下面的表展示了可以在其上運(yùn)行 DB2 32 位和 64 位客戶機(jī)應(yīng)用程序的硬件和操作系統(tǒng),這里假設(shè)這些應(yīng)用程序被正確地編譯和鏈接:

表 4. DB2 對于 32 位和 64 位平臺(tái)上 32 位和 64 位應(yīng)用程序的運(yùn)行時(shí)支持

客戶機(jī)應(yīng)用程序 32 位硬件 + 操作系統(tǒng),帶有 32 位 DB2 實(shí)例 64 位硬件 + 操作系統(tǒng),帶有 32 位或 64 位 DB2 實(shí)例
32 位客戶機(jī)應(yīng)用程序 支持 支持 (1)
64 位客戶機(jī)應(yīng)用程序 不支持 支持

(1) Windows 32 位應(yīng)用程序可以在 Windows 64 位平臺(tái)上運(yùn)行,而不需要對環(huán)境作任何改變。在 UNIX 上,通過重新綁定應(yīng)用程序并以適當(dāng)?shù)膸炻窂皆O(shè)置運(yùn)行應(yīng)用程序,便可以將已有的 32 位應(yīng)用程序部署到所有 64 位平臺(tái)上,只有 Linux IA64 和 Linux for zSeries® 例外。

關(guān)于如何正確地構(gòu)建、鏈接和鏈接要部署到不同平臺(tái)的應(yīng)用程序的建議,將在本文的 第 III 部分 中詳細(xì)討論。

DB2 的 32 位和 64 位例程支持

例程(存儲(chǔ)過程、UDF 和方法)不同于應(yīng)用程序。例程 – 封裝了數(shù)據(jù)庫和編程邏輯的數(shù)據(jù)庫對象 - 運(yùn)行在數(shù)據(jù)庫服務(wù)器上,是通過執(zhí)行特定于例程的 CREATE 語句創(chuàng)建的,該語句定義了例程的一些特征。

SQL 例程支持

對于 DB2 Version 8.2,SQL 過程定義像 SQL 函數(shù)、表、觸發(fā)器和其他數(shù)據(jù)庫對象定義一樣,完全保存在數(shù)據(jù)庫中。SQL 過程不再與任何駐留在數(shù)據(jù)庫服務(wù)器上的可執(zhí)行代碼產(chǎn)生關(guān)聯(lián),這意味著不存在與 SQL 例程的創(chuàng)建、調(diào)用、部署或遷移有關(guān)聯(lián)的 32 位或 64 位相關(guān)因素。

外部例程支持

外部例程的例程體是以一種編程語言編寫的,它被編譯成一個(gè)庫,當(dāng)例程被調(diào)用時(shí),就要裝載并運(yùn)行這個(gè)庫。在 CREATE 語句中有兩個(gè)子句用于外部例程,它們是 FENCED 和 NOT FENCED,這兩個(gè)子句將決定外部例程是在一個(gè)不同于數(shù)據(jù)庫管理器的 fenced 環(huán)境中運(yùn)行,還是在與數(shù)據(jù)庫管理器相同的尋址空間中運(yùn)行。通常,unfenced 例程比 fenced 例程執(zhí)行起來要更好一些,因?yàn)樗鼈兺ㄟ^共享內(nèi)存與數(shù)據(jù)庫管理器通信,而不是通過 TCPIP 通信。默認(rèn)情況下,不管 CREATE 語句中使用了哪些其他的子句,例程總是被創(chuàng)建為 fenced 例程。

下面的表說明了 DB2 對在運(yùn)行相同操作系統(tǒng)的 32 位和 64 位數(shù)據(jù)庫服務(wù)器上運(yùn)行 fenced 和 unfenced 32 位和 64 位例程的支持:

表 5. DB2 對在 32 位和 64 位服務(wù)器上運(yùn)行過程和 UDF 的支持

例程類型 32 位服務(wù)器 64 位服務(wù)器
32 位 fenced 過程或 UDF 支持 支持 (1)(2)(3)
64 位 fenced 過程或 UDF 不支持(4) 支持
32 位 unfenced 過程或 UDF 支持 不支持 (2)
64 位 unfenced 過程或 UDF 不支持 (4) 支持

(1) 在 64 位服務(wù)器上運(yùn)行 32 位例程不如在 64 位服務(wù)器上運(yùn)行 64 位例程那么快。
(2) 32 位例程必須創(chuàng)建為 FENCED 和 NOT THREADSAFE 才能在 64 位服務(wù)器上運(yùn)行。
(3) 在 Linux IA 64 位數(shù)據(jù)庫服務(wù)器上不能調(diào)用 32 位例程。
(4) 64 位應(yīng)用程序和例程不能在 32 位尋找空間中運(yùn)行。

在表 5 中要注意的重要一點(diǎn)是,32 位 unfenced 過程不能在 64 位 DB2 服務(wù)器上運(yùn)行。如果必須將 32 位 unfenced 例程部署到 64 位平臺(tái),那么應(yīng)該在編目這些例程之前將 NOT FENCED 子句從用于這些例程的 CREATE 語句中去掉。

32 位和 64 位外部例程解析

當(dāng)執(zhí)行引用例程的 SQL 語句(例如用于調(diào)用過程的 CALL 語句或者可以在 select 列表中包含列函數(shù)的 SELECT 查詢)時(shí),DB2 根據(jù) DB2 系統(tǒng)編目表中的例程定義解析例程引用,并在 SQL 語句的執(zhí)行過程中調(diào)用例程。

當(dāng)調(diào)用外部例程時(shí),DB2 根據(jù)名稱在數(shù)據(jù)庫服務(wù)器上找到例程的外部類或庫文件,然后裝載并運(yùn)行外部類或庫文件。在 32 位平臺(tái)上,外部例程總是作為 32 位對象來裝載和運(yùn)行。在 64 位平臺(tái)上,出于性能考慮,DB2 假設(shè)例程調(diào)用的目標(biāo)庫是 64 位的對象。因此,DB2 首先嘗試作為 64 位的對象來執(zhí)行例程的外部庫或類。如果不行的話,DB2 便自動(dòng)嘗試作為 32 位 fenced 例程庫來裝載和運(yùn)行該庫。

如果在數(shù)據(jù)庫服務(wù)器的文件系統(tǒng)中同時(shí)具有一個(gè)例程的庫或類的 32 位和 64 位版本,那么為了得到最佳性能,應(yīng)該確保該例程的 CREATE 語句標(biāo)識(shí)了正確的外部庫或類文件,而不是讓 DB2 去搜索正確的版本來運(yùn)行。

要了解關(guān)于例程解析和調(diào)用的更多信息,請參閱 Routine invocation —— 一個(gè) IBM DB2 文檔主題。

64 位數(shù)據(jù)庫服務(wù)器上 32 位外部例程的性能

由于對實(shí)現(xiàn)外部例程的選擇常?;谔岣呖蛻魴C(jī)應(yīng)用程序性能的需要,因此從外部例程中獲得最大性能通常被優(yōu)先考慮。在 64 位數(shù)據(jù)庫服務(wù)器上,外部例程的性能部分上是由外部例程是裝載 32 位還是 64 位外部例程庫來決定的。

除了 Java™ 例程以外,在 64 位服務(wù)器上調(diào)用 32 位例程在性能上不如在 64 位服務(wù)器上調(diào)用 64 位例程,因?yàn)槌鲇谛阅芸紤],DB2 首先嘗試將例程當(dāng)作 64 位對象來執(zhí)行,然后才嘗試將例程作為 32 位對象來執(zhí)行,而后者要求特殊的 32 位 fenced 模式處理。對于單獨(dú)的 32 位例程調(diào)用,其開銷顯得微不足道,但是當(dāng)這個(gè)例程被調(diào)用很多次時(shí),開銷就變得比較顯著了。如果您關(guān)心性能的話,那么建議您重新構(gòu)建(編譯、綁定和鏈接)例程源代碼來創(chuàng)建 64 位例程庫。

64 位數(shù)據(jù)庫服務(wù)器上 32 位 Java 例程的性能

關(guān)于運(yùn)行在 64 位數(shù)據(jù)庫服務(wù)器上的 32 位 Java 例程的一個(gè)好消息是,如果使用 32 位 JVM 來運(yùn)行這些 Java 例程,那么它們的性能與使用 64 位 JVM 時(shí)的 64 位 Java 例程的性能不相上下,所以您可以不需要 64 位 JVM。

32 位 Java Virtual Machines (JVM) 可以在 64 位 DB2 數(shù)據(jù)庫服務(wù)器上運(yùn)行,并且可用于運(yùn)行 32 位 Java 例程。然而,運(yùn)行在 64 位數(shù)據(jù)庫服務(wù)器 上的 32 位 Java 例程伸縮性不是很好,因?yàn)樗鼈儽仨毦幠砍?FENCED NOT THREADSAFE,并以這種形式運(yùn)行,這意味著每次調(diào)用這樣的例程時(shí),都需要使用它們自己的 JVM。如果您預(yù)測到需要例程有高度的可伸縮性,那么應(yīng)使用不同的編程語言來從創(chuàng)建在這些例程。

32 位和 64 位平臺(tái)上的 DB2 Development Center 支持

DB2 Development Center 為開發(fā)、構(gòu)建、調(diào)試和部署 SQL 和 Java 例程提供了一個(gè)圖形化的用戶界面,它是作為 DB2 Application Development Client 的一個(gè)可選組件提供的。DB2 Development Center 作為以下客戶機(jī)應(yīng)用程序中的一種受到支持:

  • AIX 32 位
  • AIX 64 位
  • Linux Intel 32 位
  • Linux IA2 64 位
  • Sun 32 位
  • Sun 64 位
  • Windows 32 位
  • Windows IA 64 位

DB2 Development Center 服務(wù)器支持

DB2 Development Center 支持到以下 DB2 數(shù)據(jù)庫服務(wù)器的連接:

  • AIX 32 位
  • AIX 64 位
  • DB2 z/OS (V6)
  • DB2 z/OS (V7)
  • DB2 z/OS (V8)
  • iSeries (V5r2)
  • iSeries (V5r3)
  • HP-UX PA64
  • HPUX IPF64
  • Linux Intel 32 位
  • Linux IA2 64 位
  • Linux /390
  • Linux z/Series
  • Sun 32 位
  • Sun 64 位
  • Windows 32 位
  • Windows IA 64 位

DB2 Development Center 例程開發(fā)和調(diào)試支持

DB2 Development Center 支持到很多 DB2 服務(wù)器的連接,并支持用于很多 DB2 服務(wù)器的 SQL 和 Java(JDBC 和 SQLJ)例程的構(gòu)建和調(diào)試。下面的表總結(jié)了 DB2 Development Center 對例程開發(fā)和調(diào)試的支持:

表 6. DB2 Development Center 32 位和 64 位例程開發(fā)和調(diào)試支持

服務(wù)器平臺(tái) SQL 過程開發(fā) SQL 過程調(diào)試 Java 過程開發(fā) Java 過程調(diào)試 SQL 標(biāo)量 & 表 UDF 開發(fā)
Windows 32 位 是(1)
Windows IA64
Linux Intel 32 位
Linux IA2 64 位
Sun 32 位
Sun 64 位
AIX 32 位 是(1)
AIX 64 位
Linux /390
HP 32 位
HP 64 位
HP-UX 64 位
Linux zSeries
DB2 z/OS (V6)
DB2 z/OS (V7)
DB2 z/OS (V8)
iSeries (V5r2)
iSeries (V5r3)

(1) 在這種服務(wù)器上開發(fā)的 Java 存儲(chǔ)過程只能在 Windows 32 位 和 AIX 32 位 Development Center 客戶機(jī)中進(jìn)行調(diào)試。

有了 Development Center,便可以執(zhí)行其他 32 位/ 64 位獨(dú)立應(yīng)用程序開發(fā)活動(dòng),包括創(chuàng)建和運(yùn)行:可以讀 WebSphere MQ® Queues 的 UDF、訪問 OLE DB 數(shù)據(jù)提供程序的 UDF,以及使用 XML 數(shù)據(jù)的 UDF。用 SQL 或 Java 以外的編程語言編寫的例程可以通過命令行和 CLP 創(chuàng)建和運(yùn)行。還可以在 Development Center 的 Server View 中執(zhí)行這些過程。這些過程不能在 Development Center 中修改或調(diào)試。要獲得 Development Center 特性和功能的完整列表,請參閱:

DB2 Development Center 例程導(dǎo)入、導(dǎo)出和部署支持

DB2 Development Center 提供了 Import Wizard、Export Wizard 和 Deployment Wizard,這些向?qū)Э捎糜趲椭D(zhuǎn)移例程定義和部署例程。Import 和 Export 向?qū)Э捎糜趯⑽淳幾g的 SQL 或 Java 例程定義從源機(jī)器轉(zhuǎn)移到目標(biāo)機(jī)器。通過使用這些向?qū)?,還可以將編譯過的例程庫和源文件一起轉(zhuǎn)移。

一旦將先前導(dǎo)出的例程定義導(dǎo)入到一個(gè) Development Center 項(xiàng)目中,便可以使用 Deployment Wizard 來部署 SQL 或 Java 例程。部署向?qū)峁┝酥匦聵?gòu)建導(dǎo)出的例程源代碼,或者使用編譯過的與例程定義一起導(dǎo)入的必需的庫來部署例程這兩個(gè)選項(xiàng)。

Deployment Wizard 在目標(biāo)服務(wù)器上編目例程,并在必要時(shí)在目標(biāo)服務(wù)器上重新構(gòu)建例程庫或類。Deployment Wizard 為重新使用已有的例程庫或類(如果適用的話)提供了一種選擇,然而,如果目標(biāo)數(shù)據(jù)庫服務(wù)器運(yùn)行的操作系統(tǒng)不同于源數(shù)據(jù)庫服務(wù)器運(yùn)行機(jī)的操作系統(tǒng),那么這就變得不可能了,因此 Deployment Wizard 將重新構(gòu)建所需的庫或類。

SQL 例程部署支持(非 Development Center 支持)

在 DB2 Version 8.2 中,SQL 過程是本地實(shí)現(xiàn)的 —— 也就是說,它們是完全在數(shù)據(jù)庫管理器中通過執(zhí)行相關(guān)的 CREATE 語句來實(shí)現(xiàn)的數(shù)據(jù)庫對象。SQL 的實(shí)現(xiàn)不存在處于數(shù)據(jù)庫管理器之外的部分。這意味著,在 DB2 Version 8.2 中創(chuàng)建或部署 SQL 過程時(shí),不需要考慮 64 位平臺(tái)。SQL 函數(shù)總是本地實(shí)現(xiàn)的,因此在創(chuàng)建或部署時(shí)也不需要考慮 64 位的問題。

在 DB2 Version 8.2 之前,DB2 的 SQL 存儲(chǔ)過程是作為可以在數(shù)據(jù)庫服務(wù)器上運(yùn)行的嵌入式 SQL C 代碼實(shí)現(xiàn)的。通過在目標(biāo)機(jī)器上重新創(chuàng)建例程,或者通過 GET ROUTINE 和 PUT ROUTINE 命令轉(zhuǎn)移編譯過的存儲(chǔ)過程,可以將這些 SQL 過程部署到另外一臺(tái)計(jì)算機(jī)上。如果目標(biāo)計(jì)算機(jī)與創(chuàng)建該過程所在的機(jī)器上運(yùn)行相同的操作系統(tǒng)和相同級(jí)別的 DB2,但是沒有安裝 C 編譯器,那么可以使用這些命令。如果您想將用 DB2 Version 8.2 之前版本的 DB2 創(chuàng)建的 32 位 SQL 過程部署到具有相同版本 DB2 的 64 位 目標(biāo)平臺(tái)上,那么必須顯式地在目標(biāo)平臺(tái)上重新創(chuàng)建 SQL 過程。

外部例程部署支持(非 Development Center 支持)

部署外部例程時(shí)需要兩個(gè)主要步驟:

  • 通過在目標(biāo)服務(wù)器上執(zhí)行例程的 CREATE 語句,在目標(biāo)數(shù)據(jù)庫服務(wù)器中編目例程。
  • 重新構(gòu)建和部署例程庫或類到目標(biāo)服務(wù)器的函數(shù)目錄中,這是可選的。

外部例程庫和類實(shí)際上是和客戶機(jī)應(yīng)用程序一樣創(chuàng)建的,不同的是還需要一些附加的鏈接器(linker)選項(xiàng)。因此,在不使用 Development Center 的情況下,例程的部署非常類似于客戶機(jī)應(yīng)用程序的部署??蛻魴C(jī)應(yīng)用程序的部署在本文的第 II 部分討論。





回頁首


第 III 部分:開發(fā)和部署可移植的 32 位和 64 位 DB2 應(yīng)用程序

不管您是想在 32 位 DB2 實(shí)例上開發(fā) 64 位應(yīng)用程序、部署 32 位應(yīng)用程序到 64 位實(shí)例,還是想保證以后這樣做時(shí)沒有障礙,都應(yīng)該遵循下面這一節(jié)中列出的最佳實(shí)踐。

開發(fā)平臺(tái)獨(dú)立的應(yīng)用程序和例程

作為一條通用法則,如果您使用 32 位 DB2 實(shí)例開發(fā)數(shù)據(jù)庫應(yīng)用程序或例程,并預(yù)測到將來要將它們部署到 64 位 DB2 實(shí)例上,那么在開發(fā)這種數(shù)據(jù)庫應(yīng)用程序或例程時(shí)應(yīng)該特別小心,盡可能使它們具有可移植性。為了使應(yīng)用程序和例程有可移植性,應(yīng)使用標(biāo)準(zhǔn)的平臺(tái)無關(guān)的代碼。例如,如果保持采用 ISO 中提供的功能性的一個(gè)子集的習(xí)慣,那么 C 規(guī)范將確保代碼更有可能具有可移植性。當(dāng)然,在代碼中避免使用特定于平臺(tái)的方法或硬編碼的文件或目錄名同樣有所幫助。當(dāng)部署應(yīng)用程序時(shí),您不想看到某些方法在目標(biāo)平臺(tái)上不受支持,或者因?yàn)槟繕?biāo)環(huán)境不同于開發(fā)環(huán)境而導(dǎo)致路徑名無效。

使用 DB2 可移植數(shù)據(jù)類型作為數(shù)字宿主變量

在 32 位和 64 位應(yīng)用程序中,數(shù)字?jǐn)?shù)據(jù)類型可以用不同的位數(shù)來表示。例如,在 C 或 C++ 編程中,int 和 long 數(shù)據(jù)類型的長度沒有指定。對于 DB2 支持的所有 UNIX 平臺(tái),在 32 位應(yīng)用程序 中 long 類型總是用 32 位表示,而在 64 位應(yīng)用程序中則用 64 位來表示。在 Windows 中,long 類型總是用 32 位表示。表 7 展示了 C 和 C++ 數(shù)據(jù)類型需要的位數(shù)在 32 位和 64 位應(yīng)用程序之間的區(qū)別。

表 7:32 位 和 64 位應(yīng)用程序中 C 和 C++ 數(shù)據(jù)類型表示需要的位數(shù)

應(yīng)用程序的類型 Char Short Int Long 內(nèi)存地址
32 位 UNIX 和 Windows 8 16 32 32 32
64 位 UNIX 8 16 32 64 64
64 位 Windows 8 16 32 32 64

如果將一開始為 32 位平臺(tái)編寫的應(yīng)用程序重新構(gòu)建為 64 位應(yīng)用程序,那么各種數(shù)據(jù)類型可能需要的不同長度將導(dǎo)致不正確的功能。例如,當(dāng)運(yùn)行那樣的應(yīng)用程序時(shí),您可能會(huì)碰到數(shù)字?jǐn)?shù)據(jù)被截?cái)嗟那闆r,以及由于內(nèi)存地址被截?cái)喽鴮?dǎo)致的無效數(shù)據(jù),或者空指針引用錯(cuò)誤。

為舉例說明為什么應(yīng)該使用推薦的可移植數(shù)據(jù)類型,請考慮下面的例子。假設(shè)您決定使用下面某一種本地?cái)?shù)據(jù)類型來表示一個(gè) BIGINT SQL 數(shù)據(jù)類型:

  1. long long
  2. long
  3. __int64

您可以使用上面任何一種數(shù)據(jù)類型來表示 BIGINT,但是您必須愿意接受下面對應(yīng)用程序的限制:

  1. 如果使用 “long long”,那么應(yīng)用程序只能在 UNIX 平臺(tái)上運(yùn)行。
  2. 如果使用 “long”,那么應(yīng)用程序只能在 64 位 UNIX 平臺(tái)上運(yùn)行。
  3. 如果使用 “__int64”,那么應(yīng)用程序只能在 Windows 平臺(tái)上運(yùn)行。

為了防止這類移植性問題的發(fā)生,DB2 提供了一套可移植的宿主變量數(shù)據(jù)類型,您應(yīng)該使用這些數(shù)據(jù)類型,而不是使用特定于平臺(tái)的本地?cái)?shù)據(jù)類型。位于 SQLLIB\include (Windows) 或 sqllib/include/ (UNIX) 目錄中的 DB2 頭文件 sqlsystm.h 包含了可用的可移植數(shù)據(jù)類型的定義。具體地說,在應(yīng)用程序中應(yīng)該使用這些可移植類型進(jìn)行宿主變量的聲明。圖 8 展示了在應(yīng)用程序中應(yīng)該用于 SQL 宿主變量的推薦的 DB2 可移植數(shù)據(jù)類型。

表 7: 32 位 和 64 位應(yīng)用程序中 C 和 C++ 數(shù)據(jù)類型表示所需的位數(shù)

SQL 數(shù)據(jù)類型 本地類型 推薦的 DB2 UDB 可移植類型
SMALLINT short
unsigned short
sqlint16
sqluint16
INTEGER Integer sqlint32
BIG INTEGER long
unsigned long
sqlint64
DOUBLE long
unsigned long
sqlint32
DECIMAL long
unsigned long
sqlint32

C/ C++ 與 Java 的比較:在 Java 中,long 總是 64 位,因此適合 BIG INTEGER 值。同樣,在 Java 中,整型(integer)數(shù)據(jù)類型總是以 32 位表示,因此總是適合 SQL INTEGER 值。

要了解對于每種編程語言的建議數(shù)據(jù)類型的完整集合,請參閱本文后面的 參考資料部分中的相關(guān)鏈接。

使用 LONGERROR YES 選項(xiàng)預(yù)編譯 C / C++ 應(yīng)用程序

為了幫助您找出 C 和 C++ 代碼中對 long 數(shù)據(jù)類型潛在的有問題的使用,DB2 提供了 LONGERROR 預(yù)編譯選項(xiàng)。在將此選項(xiàng)顯式地設(shè)為 YES 的情況下,在預(yù)編譯 32 位 DB2 實(shí)例中的應(yīng)用程序時(shí),DB2 的預(yù)編譯器一碰到類型為 long 的宿主變量就會(huì)返回一個(gè)錯(cuò)誤。

使用 LONGERROR 選項(xiàng)預(yù)編譯 32 位 DB2 實(shí)例中的應(yīng)用程序代碼是確保應(yīng)用程序代碼可以在 64 位 DB2 實(shí)例中成功運(yùn)行的一種好方法。下面的步驟列出了如何做到這一點(diǎn):

  1. 鏈接到 32 位或 64 位的數(shù)據(jù)庫。
  2. 在將 LONGERROR 選項(xiàng)的值指定為 YES 的情況下,使用 PRECOMPILE 命令預(yù)編譯應(yīng)用程序。
  3. 對于每個(gè)因使用 long 數(shù)據(jù)類型而報(bào)告出來的錯(cuò)誤,用一種可移植的宿主變量聲明(例如 sqlint32 或 sqluint32)代替 long 數(shù)據(jù)類型聲明。例如,將:
    EXEC SQL BEGIN DECLARE SECTION;
                                                    long y;        /* Generates an error on 64-bit platform */
                                                    EXEC SQL END DECLARE SECTION;
                                                    

    替換為:
    EXEC SQL BEGIN DECLARE SECTION;
                                                    sqlint32 y;    /* Acceptable to represent long on 64-bit platform */
                                                    EXEC SQL END DECLARE SECTION;
                                                    

  4. 解決了 LONGERROR 報(bào)告出來的所有錯(cuò)誤之后,再次根據(jù)目標(biāo)數(shù)據(jù)庫預(yù)編譯應(yīng)用程序,為應(yīng)用程序創(chuàng)建一個(gè)包。

在構(gòu)建 32 位還是 64 位應(yīng)用程序或例程之間作出選擇

您應(yīng)該將應(yīng)用程序和例程構(gòu)建為 32 位還是 64 位的對象呢?對于 Java 和 COBOL 以外的大多數(shù)編程語言,如果您知道應(yīng)用程序或外部例程將被部署到 64 位的平臺(tái),并且將在 64 位 DB2 實(shí)例中運(yùn)行,那么肯定應(yīng)該編譯它們的 64 位的版本。如果關(guān)心可移植性,那么應(yīng)該選擇 32 位,以簡化開發(fā)和測試。如果有一組數(shù)量很多的應(yīng)用程序和例程,那么可能需要概況出它們的執(zhí)行時(shí)間,并將最常用的應(yīng)用程序和例程編譯成本地的 64 位代碼。

對于 Java 應(yīng)用程序和例程,情況要復(fù)雜一點(diǎn),因?yàn)樵诒疚陌l(fā)表之際,IBM 還沒有發(fā)布 64 位的 Java 虛擬機(jī)。然而,讓 32 位 DB2 應(yīng)用程序和例程在帶有 IBM 的 Java 1.4-level 32 位 JVM 的 64 位 DB2 實(shí)例仍是可能的。注意,所有 32 位 Java 與 DB2 數(shù)據(jù)庫的通信都限于使用 Type 1 或 Type 2 JDBC 驅(qū)動(dòng)程序。

至于 COBOL,DB2 只支持在所有受支持的 32 位操作系統(tǒng)上和除 Linux IA 64 位 和 Linux zSeries 以外的所有受支持的 64 位操作系統(tǒng)平臺(tái)上運(yùn)行 32 位 COBOL 應(yīng)用程序。

通常,應(yīng)盡可能為 32 位 DB2 實(shí)例構(gòu)建 32 位的應(yīng)用程序,而為 64 位 DB2 實(shí)例構(gòu)建 64 位的應(yīng)用程序,只有在這種支持不存在的情況下才可以例外。下一節(jié)將談?wù)撊绾巫?32 位應(yīng)用程序在 64 位 DB2 實(shí)例中運(yùn)行。

構(gòu)建支持跨平臺(tái)(32 位/ 64 位)部署的應(yīng)用程序

為了減少應(yīng)用程序運(yùn)行時(shí)問題出現(xiàn)的可能性,應(yīng)該在應(yīng)用程序?qū)硭诘钠脚_(tái)上構(gòu)建和測試應(yīng)用程序代碼。如果這一點(diǎn)不合實(shí)際,例如沒有所需的編譯器,那么可以在一個(gè)平臺(tái)上構(gòu)建應(yīng)用程序,而將應(yīng)用程序部署到它們將來運(yùn)行時(shí)所在的平臺(tái)上,但是在鏈接應(yīng)用程序和指定運(yùn)行時(shí)庫路徑時(shí),應(yīng)特別小心。

為了使功能正常,32 位 DB2 應(yīng)用程序必須鏈接到一套 32 位的 DB2 庫,而 64 位 DB2 應(yīng)用程序必須鏈接到一套 64 位的 DB2 庫。這些庫的特定于 32 位或 64 位的版本,可以在下面的默認(rèn)目錄路徑中找到,它們因平臺(tái)而異:

  • $INSTHOME/sqllib/lib (UNIX)
  • $INSTHOME\SQLLIB\lib (Windows)

其中 $INSTHOME 是 DB2 實(shí)例所有者的主目錄。

默認(rèn)情況下,在 32 位 DB2 實(shí)例中,該目錄包含 32 位版本的 DB2 庫,在 64 位 DB2 實(shí)例中,該目錄包含 64 位版本的相同的庫。您也可以在 64 位 DB2 實(shí)例中訪問 32 位版本的庫,而在 32 位 DB2 實(shí)例中訪問 64 位版本的庫,以執(zhí)行跨平臺(tái)開發(fā)。32 位和 64 位 DB2 庫放在下面的目錄中:

表 7: 32 位和 64 位應(yīng)用程序中 C 和 C++ 數(shù)據(jù)類型表示所需的位數(shù)

平臺(tái) 32 位 DB2 庫目錄 64 位 DB2 庫目錄
Windows $INSTHOME\SQLLIB\lib32 $INSTHOME\SQLLIB\lib\Win64 (Windows IA 64)
UNIX $INSTHOME/sqllib/lib32 $INSTHOME/sqllib/lib64

注意: $INSTHOME 是 DB2 實(shí)例所有者的主目錄。

您必須在編譯/鏈接時(shí)將應(yīng)用程序鏈接到適當(dāng)?shù)囊唤M DB2 庫。而且還必須確保在編譯/鏈接時(shí),所鏈接到的庫在應(yīng)用程序運(yùn)行時(shí)是可用的。您可以依賴于可用的默認(rèn)庫路徑,或者顯式地指定要使用的運(yùn)行時(shí)庫路徑。下面的步驟列出了在不同場景中應(yīng)該如何編譯和鏈接應(yīng)用程序:

構(gòu)建要部署到 32 或 64 位 DB2 實(shí)例中的 32 位和 64 位應(yīng)用程序的步驟

  1. 連接到一個(gè)數(shù)據(jù)庫。
    • 對于 32 位應(yīng)用程序,連接到 32 位的數(shù)據(jù)庫,對于 64 位應(yīng)用程序,連接到 64 位的數(shù)據(jù)庫。
  2. 預(yù)編譯應(yīng)用程序,以便為應(yīng)用程序創(chuàng)建一個(gè)包。
  3. 編譯應(yīng)用程序。
    • 對于 32 位應(yīng)用程序,在 32 位模式下編譯應(yīng)用程序,或者指定一個(gè) 64 位模式的編譯器選項(xiàng),來創(chuàng)建 64 位應(yīng)用程序。
  4. 將應(yīng)用程序與適當(dāng)?shù)?32 位或 64 位 DB2 庫進(jìn)行鏈接,也可以指定運(yùn)行時(shí)庫路徑:
    1. 鏈接應(yīng)用程序
      • 對于在 32 位 DB2 實(shí)例中構(gòu)建的要部署到 32 位或 64 位 DB2 實(shí)例的 32 位應(yīng)用程序,鏈接到默認(rèn) DB2 庫路徑中的庫,或者顯式地指定 32 位 DB2 庫目錄。
      • 對于在 64 位 DB2 實(shí)例中構(gòu)建的要部署到 64 位 DB2 實(shí)例中的 64 位應(yīng)用程序,鏈接到默認(rèn) DB2 庫路徑中的庫,或者顯式地指定 64 位 DB2 庫目錄。
      • 對于要部署到 32 位平臺(tái)上的 64 位應(yīng)用程序,鏈接到 64 位庫目錄中的庫。
    2. 指定運(yùn)行時(shí)庫路徑(可選)
      • 為了讓 DB2 應(yīng)用程序能夠正確運(yùn)行,運(yùn)行時(shí)庫路徑必須包括用于鏈接應(yīng)用程序的 DB2 庫,否則應(yīng)用程序?qū)⒁驗(yàn)閹煅b載錯(cuò)誤而運(yùn)行失敗。運(yùn)行時(shí)庫路徑可以在鏈接時(shí)顯式地設(shè)置,或者也可以在應(yīng)用程序運(yùn)行時(shí)指定。如果在運(yùn)行時(shí),用來鏈接應(yīng)用程序的 DB2 庫不在默認(rèn)的 DB2 庫目錄中,則必須顯式地指定在什么地方可以找到這些庫。下面將詳細(xì)描述指定運(yùn)行時(shí)庫路徑的技術(shù)。
  5. 將應(yīng)用程序綁定到目標(biāo)服務(wù)器上的數(shù)據(jù)庫。

使用絕對路徑指定應(yīng)用程序運(yùn)行時(shí)庫路徑

當(dāng)把應(yīng)用程序從源計(jì)算機(jī)部署到另一臺(tái)目標(biāo)計(jì)算機(jī)時(shí),考慮目標(biāo)計(jì)算機(jī)上運(yùn)行時(shí)庫路徑的規(guī)范很重要,因?yàn)樵谠从?jì)算機(jī)上鏈接庫時(shí)所使用的所有相對路徑在目標(biāo)計(jì)算機(jī)上都可能是無效的。因此,在鏈接應(yīng)用程序時(shí),或者在運(yùn)行應(yīng)用程序之前,通過一個(gè)附加的鏈接器選項(xiàng)使用絕對路徑來指定運(yùn)行時(shí)庫路徑常常很有用 —— 大多數(shù)編譯器都提供了對該選項(xiàng)的支持。

下面的例子研究了用來指定運(yùn)行時(shí)庫路徑的一些選項(xiàng):

例 1: 將應(yīng)用程序部署到不同計(jì)算機(jī)上的相似的(32 位 / 64 位)實(shí)例中。

Joe 在他的 DB2 開發(fā)計(jì)算機(jī)上的一個(gè) 32 位 DB2 實(shí)例中,使用默認(rèn)的 DB2 庫路徑構(gòu)建了一個(gè) 32 位應(yīng)用程序。Joe 想將這個(gè)應(yīng)用程序部署到另一臺(tái)計(jì)算機(jī)(他的生產(chǎn)計(jì)算機(jī))上的一個(gè) 32 位的生產(chǎn)實(shí)例中。在這臺(tái)部署計(jì)算機(jī)上,Joe 的本地 DB2 實(shí)例名是 JOEINST,他的主目錄是 /home2/joe/。即:

Development computer
                                            # DB2INSTANCE = JOEINST
                                            # HOME = /home2/joe
                                            

Joe 的生產(chǎn)計(jì)算機(jī)有一個(gè)具有相同名稱的 DB2 實(shí)例;然而,在這臺(tái)計(jì)算機(jī)上 Joe 的主目錄不同:

Production computer
                                            # DB2INSTANCE = JOEINST
                                            # HOME = /u/production
                                            

Joe 在鏈接時(shí)指定了一個(gè)運(yùn)行時(shí)庫路徑,它包括相對路徑值:

$HOME/sqllib/lib
                                            

當(dāng) Joe 試圖在生產(chǎn)計(jì)算機(jī)上運(yùn)行該應(yīng)用程序時(shí),由于裝載器錯(cuò)誤,運(yùn)行將遭到失敗,因?yàn)樯a(chǎn)計(jì)算機(jī)上的 $HOME 解析后不同于開發(fā)環(huán)境中的路徑,所有找不到所需的運(yùn)行時(shí)庫。這說明了為什么相對路徑是有問題的。

解決這一問題的一種方法是在運(yùn)行時(shí)裝載路徑中不使用 $HOME。另一種方法是,可以在鏈接時(shí)指定一個(gè)基于 DB2 絕對安裝路徑的運(yùn)行時(shí)庫路徑。也就是說,Joe 可以將應(yīng)用程序與下面的絕對運(yùn)行時(shí)庫路徑相鏈接:

/usr/opt/db2_08_01/lib
                                            

只要生產(chǎn)環(huán)境中的 DB2 的版本和開發(fā)環(huán)境中 DB2 的版本相同(相同的版本和修復(fù)包),并且開發(fā)平臺(tái)和生產(chǎn)平臺(tái)都同時(shí)是 32 位或 64 位,那么這項(xiàng)技術(shù)就是有效的。

例 2:將應(yīng)用程序從同一臺(tái)計(jì)算機(jī)上的 32 位實(shí)例部署到 64 位實(shí)例

Azuma 在一個(gè) 32 位 AIX DB2 實(shí)例中開發(fā)了一個(gè)應(yīng)用程序。當(dāng) Azuma 構(gòu)建最近的應(yīng)用程序時(shí),他用下面的鏈接器選項(xiàng)指定了一個(gè)運(yùn)行時(shí)庫路徑:

-L$/usr/opt/db2_08_01/lib
                                            

如果 Azuma 將他的實(shí)例更新為 64 位 DB2 實(shí)例,而保持所有其他目錄路徑不變,然后他嘗試運(yùn)行應(yīng)用程序,結(jié)果由于裝載器錯(cuò)誤,導(dǎo)致應(yīng)用程序不能運(yùn)行,因?yàn)樗溄討?yīng)用程序時(shí)使用的運(yùn)行時(shí)庫路徑現(xiàn)在被鏈接到 sqllib/lib64,而這里包含的是 64 位 DB2 庫。

為了避免發(fā)生這種情況,Azuma 應(yīng)該顯式地將他的應(yīng)用程序鏈接到 sqllib/lib32,而不是鏈接到默認(rèn)的目錄路徑 sqllib/lib。如果 Azuma 這樣做了,他的應(yīng)用程序就不會(huì)因?qū)嵗桓聲r(shí) DB2 默認(rèn)庫目錄的改變而受到影響。加上我們在例 1 中學(xué)到的東西,對于 Azuma 來說,理想的運(yùn)行時(shí)庫裝載路徑的指定應(yīng)該如下所示:

/usr/opt/db2_08_01/lib32
                                            

如果在 32 位實(shí)例上開發(fā) 32 位應(yīng)用程序,并預(yù)測到可能要更新到 64 位 DB2 實(shí)例,或者不得不將應(yīng)用程序部署到帶有相同版本 DB2 的 64 位 DB2 安裝的計(jì)算機(jī)上,那么這樣指定庫裝載路徑是一種很好的選擇,因?yàn)榘惭b路徑是一樣的。

但是,如果您合理地預(yù)測到要周期性地更新到將來版本的 DB2,那么這樣指定庫路徑就不是很好。新版本的 DB2 和 DB2 修復(fù)包可能有不同的安裝路徑。如果 DB2 安裝路徑發(fā)生了變化,那么與基于 DB2 安裝路徑指定的運(yùn)行時(shí)庫路徑鏈接的應(yīng)用程序?qū)o法再運(yùn)行。

例 3:將應(yīng)用程序從不同計(jì)算機(jī)上的 32 位實(shí)例部署到 64 位實(shí)例

例 2 中描述的技術(shù)也適用于將應(yīng)用程序從不同計(jì)算機(jī)上的 32 位實(shí)例部署到 64 位實(shí)例,前提是這兩臺(tái)計(jì)算機(jī)都安裝了相同版本的 DB2,并運(yùn)行相同的操作系統(tǒng)。

您可以看到,您計(jì)劃執(zhí)行的部署類型將影響到應(yīng)該如何在鏈接時(shí)為應(yīng)用程序指定運(yùn)行時(shí)庫路徑。只要開發(fā)環(huán)境和生產(chǎn)環(huán)境中 DB2 的版本是一樣的,使用絕對路徑來指定運(yùn)行時(shí)庫路徑可以簡化部署。

使 32 位應(yīng)用程序可以在 64 位環(huán)境中運(yùn)行

如果您將數(shù)據(jù)庫客戶機(jī)或服務(wù)器更新到 64 位的平臺(tái),并希望將已有的經(jīng)過編譯和鏈接的應(yīng)用程序移植到新的 DB2 實(shí)例中,那么根據(jù)平臺(tái)的不同,您可能需要在新 DB2 實(shí)例中重新構(gòu)建應(yīng)用程序,或者重新綁定應(yīng)用程序并覆蓋以前指定的運(yùn)行時(shí)庫路徑。前面我們已討論過,這樣做的原因是,在 64 位 DB2 實(shí)例中默認(rèn)的 DB2 庫路徑可能不包含鏈接應(yīng)用程序時(shí)和運(yùn)行時(shí)所使用的運(yùn)行時(shí)庫。

在部署應(yīng)用程序之前,在一個(gè)模擬生產(chǎn)環(huán)境的測試環(huán)境中重新構(gòu)建和編譯應(yīng)用程序仍然是最佳選擇,但是如果時(shí)間限制或者不能訪問原始應(yīng)用程序源代碼等原因阻礙了我們這么做,那么可以使用下面描述的技術(shù)。

將 Windows 32 位應(yīng)用程序部署到 Windows IA 64 位平臺(tái)

幸運(yùn)的是,Windows 32 位客戶機(jī)應(yīng)用程序和例程可以在 Windows IA 64 位服務(wù)器上運(yùn)行,而不需要對 64 位環(huán)境作任何更改。為了使這些應(yīng)用程序可以運(yùn)行,不需要重新構(gòu)建應(yīng)用程序來覆蓋運(yùn)行時(shí)庫路徑。然而,32 位 Windows 應(yīng)用程序在 Windows IA 64 平臺(tái)上的性能不是很好,所以,如果性能比較重要,那么強(qiáng)烈建議您將應(yīng)用程序重新構(gòu)建為 64 位 Windows 應(yīng)用程序。

將 UNIX 32 位應(yīng)用程序部署到 UNIX 64 位平臺(tái)

除了 Linux IA 64 位、Linux PPC 64 位和 Linux zSeries 之外,所有受支持的 64 位版本的 DB2 都支持已有 32 位客戶機(jī)應(yīng)用程序的移植。為了在這些平臺(tái)上移植 32 位客戶機(jī)應(yīng)用程序,必須重新綁定應(yīng)用程序,并在正確地設(shè)置了庫路徑的情況下運(yùn)行應(yīng)用程序。

在 HP-UX 上,如果應(yīng)用程序一開始是以 +s 選項(xiàng)鏈接的,那么只能移植 32 位客戶機(jī)應(yīng)用程序。如果一開始應(yīng)用程序不是以 +s 選項(xiàng)鏈接,那么必須用 +s 編譯器選項(xiàng)重新構(gòu)建應(yīng)用程序,或者用嵌入式運(yùn)行時(shí)路徑設(shè)置重新構(gòu)建應(yīng)用程序,以包括 32 位 DB2 庫(參見下面內(nèi)容)。

在 UNIX 上,64 位環(huán)境中用于 32 位 DB2 應(yīng)用程序的正確的庫路徑是 INSTHOME/sqllib/lib32,其中 INSTHOME 是 Version 8 實(shí)例所有者的主目錄;然而,如果您讓 64 位應(yīng)用程序也在這種環(huán)境中運(yùn)行(或者打算這么做),那么不應(yīng)該將 LIBPATH 環(huán)境變量的默認(rèn)設(shè)置從 INSTHOME/sqllib/lib64 改為 INSTHOME/sqllib/lib32,因?yàn)樾碌脑O(shè)置將影響 DB2 實(shí)例中所有的應(yīng)用程序(32 位和 64 位)。

所以,32 位和 64 位應(yīng)用程序都應(yīng)該各自引用適當(dāng)?shù)?DB2 庫目錄,您可以創(chuàng)建一個(gè)包裝器腳本來運(yùn)行應(yīng)用程序,在運(yùn)行應(yīng)用程序之前讓這個(gè)腳本來設(shè)置運(yùn)行時(shí)庫路徑(或者任何其他必需的環(huán)境變量),在運(yùn)行之后再重置這些設(shè)置。下面是一個(gè)可以使用的包裝器腳本的例子:

 #! /bin/sh
                                            echo <ENV_VAR_SETTING>
                                            export <ENV_VAR_SETTING>
                                            echo
                                            echo Running application...
                                            $1
                                            echo ...Done running application.
                                            

其中 <ENV_VAR_SETTING> 是為特定平臺(tái)設(shè)置運(yùn)行時(shí)庫路徑的環(huán)境變量。

表 7: 32 位和 64 位應(yīng)用程序中 C 和 C++ 數(shù)據(jù)類型表示所需的位數(shù)

平臺(tái) 環(huán)境變量設(shè)置
AIX LIBPATH=$HOME/sqllib/lib32:$LIBPATH
Linux LD_LIBRARY_PATH=$HOME/sqllib/lib32:$LD_LIBRARY_PATH
Solaris LIBRARY_PATH=$HOME/sqllib/lib32:$LD_LIBRARY_PATH
HP-UX SHLIB_PATH=$HOME/sqllib/lib32:$SHLIB_PATH
-OR-
LD_LIBRARY_PATH=$HOME/sqllib/lib32:$LD_LIBRARY_PATH

注意:如果應(yīng)用程序是以 +s 選項(xiàng)鏈接的,則該包裝器只能在 HP-UX 上運(yùn)行。

您可以通過在命令行中輸入包裝器腳本名稱,后面跟上可執(zhí)行文件名來運(yùn)行這個(gè)包裝器程序:

	   <wrapper_script> <executable>
                                            

如果包裝器腳本的庫路徑與被調(diào)用的可執(zhí)行文件不兼容,那么對于調(diào)用其他可執(zhí)行文件(例如帶有 C 系統(tǒng)調(diào)用)的應(yīng)用程序來說,在包裝器內(nèi)更改環(huán)境變量是不可行的。為了移植這些應(yīng)用程序,必須重新鏈接目標(biāo)文件,然后重新構(gòu)建應(yīng)用程序。

通常,應(yīng)該用運(yùn)行時(shí)庫路徑 lib32 來鏈接目標(biāo)文件,而不是用平臺(tái)上的環(huán)境變量。示例程序的 C、C++ 和 CLI 構(gòu)建腳本使用適當(dāng)?shù)倪\(yùn)行時(shí)路徑來允許將新的應(yīng)用程序輕松地移植到 64 位平臺(tái)上去。

應(yīng)該使用相同的鏈接選項(xiàng)來鏈接 64 位平臺(tái)上已有 32 位應(yīng)用程序的目標(biāo)文件(請從下面查看示例中構(gòu)建腳本的相關(guān)鏈接)。下面的標(biāo)記可用于將 32 位 db2 庫包括到運(yùn)行時(shí)庫路徑中:

  • HP-UX: -Wl,+b$DB2PATH/lib32
  • Linux: -Wl,-rpath,$DB2PATH/lib32
  • Solaris: -R$DB2PATH/lib32
  • AIX: -L$DB2PATH/lib32

對于 AIX,可以使用 -blibpath 鏈接器選項(xiàng)來指定一個(gè)完整的運(yùn)行時(shí)庫路徑。

注意:

這些命令都假設(shè)使用編譯器進(jìn)行鏈接,而不是使用 ld 直接進(jìn)行鏈接。

  1. 在 Solaris 上,在將應(yīng)用程序與運(yùn)行時(shí)路徑鏈接之前,必須將 LD_LIBRARY_PATHLD_LIBRARY_PATH_32 復(fù)位。如果沒有這么做,那么將使用 LD_LIBRARY_PATHLD_LIBRARY_PATH_32 設(shè)置,而不是使用運(yùn)行時(shí)路徑設(shè)置。
  2. 在 Linux 上,如果使用 --enable-new-dtags 鏈接選項(xiàng),那么在運(yùn)行 32 位可執(zhí)行文件之前,應(yīng)將 LD_LIBRARY_PATH 復(fù)位。如果不這樣做,那么就會(huì)使用 LD_LIBRARY_PATH 設(shè)置,而不是使用運(yùn)行時(shí)路徑設(shè)置。

要了解更多關(guān)于何時(shí)以及如何創(chuàng)建特定于平臺(tái)的、可用于設(shè)置運(yùn)行時(shí)庫路徑的腳本的信息,請參閱下面的主題:
Migrating applications from 32 位 to 64 位 environments —— 一個(gè) IBM DB2 文檔主題。





回頁首


結(jié)束語

DB2 對跨平臺(tái)開發(fā)的支持使您可以靈活地開發(fā)數(shù)據(jù)庫應(yīng)用程序,將它們部署到不同的平臺(tái)上。本文提供了關(guān)于 DB2 32 位和 64 位應(yīng)用程序和例程支持的信息,并展示了開發(fā)和構(gòu)建應(yīng)用程序時(shí)考慮數(shù)據(jù)庫向不同平臺(tái)的移植、同時(shí)使應(yīng)用程序更易于部署的重要性。

本文應(yīng)該有助于您:

  • 理解計(jì)算系統(tǒng)中 32 位和 64 位對象之間的關(guān)系。
  • 了解關(guān)于 DB2 對 32 位和 64 位應(yīng)用程序和例程的支持。
  • 了解如何開發(fā)易于移植的應(yīng)用程序。
  • 確定引用應(yīng)用程序依賴的庫路徑的策略,以使應(yīng)用程序能正常運(yùn)行。

通常,您應(yīng)該為開發(fā)和部署應(yīng)用程序采取單一的策略,以減少對一些特殊情形的管理,從而可以節(jié)省不少時(shí)間,減少了一些挫折。在開發(fā)跨平臺(tái)部署的應(yīng)用程序的過程當(dāng)中,真正的教訓(xùn)就是“想在前頭”。在應(yīng)用程序開發(fā)時(shí),一點(diǎn)點(diǎn)的計(jì)劃就可以令應(yīng)用程序的部署順利完成,換來無比的快樂。





回頁首


致謝

感謝 Peeter Joot、Ryan Mayor、Ronald Trueblood 和 Dan Behman,他們?yōu)槲姨峁┝藢氋F的信息,并抽時(shí)間審校了本文。



參考資料



關(guān)于作者

 

Gwyneth Evans 是多倫多 IBM Software Lab 中的 DB2 Solutions Development 小組在 DB2 UDB for Linux、UNIX 和 Windows 方面的軟件和信息開發(fā)人員。先前,她曾作為一名應(yīng)用開發(fā)人員,從事過 DB2 UDB for Linux、UNIX 和 Windows 產(chǎn)品的產(chǎn)品開發(fā)工作。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請遵守用戶 評(píng)論公約

    類似文章 更多