欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
使用 DB2 UDB V8.2 進(jìn)行 32 位和 64 位應用程序開(kāi)發(fā)

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

2004 年 11 月 01 日

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

術(shù)語(yǔ)

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

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




回頁(yè)首


簡(jiǎn)介

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

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





回頁(yè)首


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

廣泛理解 32 位和 64 位對象在計算環(huán)境中的相關(guān)性十分重要,因為它們之間的某些依賴(lài)性可能影響到各個(gè)方面,包括所需購買(mǎi)的硬件,部署應用程序的方式等。

32 位和 64 位硬件

32 位計算機硬件使用 32 位來(lái)表示內存地址以及處理指令和數據。64 位硬件使用 64 位來(lái)做同樣的事情。通常,32 位操作系統運行在 32 位的硬件上,而 64 位操作系統則運行在 64 位的硬件上,不過(guò)在某些 64 位的硬件上運行 32 位操作系統也是可能的。

32 位和 64 位操作系統

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

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

32 位和 64 位應用程序

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

當您在 32 位或 64 位平臺上編譯應用程序時(shí),默認情況下應用程序被編譯為在某種特定平臺上運行。通過(guò)使用特殊的特定于編譯器的編譯選項,并適當地鏈接到合適的 32 位或 64 位庫,也可以在帶有某些編譯器的 32 位操作系統上創(chuàng )建 64 位應用程序,或者在 64 位操作系統上創(chuàng )建 32 位應用程序。

32 位應用程序通??梢酝瑫r(shí)在 32 位和 64 位操作系統上運行,不過(guò)在很多采用 32 位內核的操作系統上不能運行 64 位應用程序。

DB2 32 位和 64 位對象概述

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

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

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

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





回頁(yè)首


第 II 部分:DB2 32 位和 64 位應用程序和例程支持

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

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

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

表 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)品開(kāi)發(fā)數據庫應用程序,前提是在客戶(hù)機上安裝了 DB2 Application Development Client。

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

受支持的 32 位和 64 位平臺

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

表 2. 受支持的平臺

32 位平臺 64 位平臺 混合平臺
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

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

  • 可以有更多的內存用于構建和運行更大的應用程序。
  • 更有效的數據處理和更好的應用程序性能。

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

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

DB2 32 位和 64 位數據庫連接支持

您可以混合和匹配選作 DB2 數據庫客戶(hù)機和服務(wù)器的平臺,因為 DB2 支持從 32 位和 64 位客戶(hù)機到數據庫服務(wù)器的本地和遠程連接。

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

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

DB2 客戶(hù)機 32 位 DB2 服務(wù)器(本地和遠程) 64 位 DB2 服務(wù)器(本地和遠程)
32 位客戶(hù)機 支持 支持 (1)
64 位客戶(hù)機 支持 支持

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

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

DB2 的 32 位和 64 位客戶(hù)機應用程序支持

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

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

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

表 4. DB2 對于 32 位和 64 位平臺上 32 位和 64 位應用程序的運行時(shí)支持

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

(1) Windows 32 位應用程序可以在 Windows 64 位平臺上運行,而不需要對環(huán)境作任何改變。在 UNIX 上,通過(guò)重新綁定應用程序并以適當的庫路徑設置運行應用程序,便可以將已有的 32 位應用程序部署到所有 64 位平臺上,只有 Linux IA64 和 Linux for zSeries® 例外。

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

DB2 的 32 位和 64 位例程支持

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

SQL 例程支持

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

外部例程支持

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

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

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

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

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

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

32 位和 64 位外部例程解析

當執行引用例程的 SQL 語(yǔ)句(例如用于調用過(guò)程的 CALL 語(yǔ)句或者可以在 select 列表中包含列函數的 SELECT 查詢(xún))時(shí),DB2 根據 DB2 系統編目表中的例程定義解析例程引用,并在 SQL 語(yǔ)句的執行過(guò)程中調用例程。

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

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

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

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

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

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

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

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

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

32 位和 64 位平臺上的 DB2 Development Center 支持

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

  • 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 數據庫服務(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 例程開(kāi)發(fā)和調試支持

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

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

服務(wù)器平臺 SQL 過(guò)程開(kāi)發(fā) SQL 過(guò)程調試 Java 過(guò)程開(kāi)發(fā) Java 過(guò)程調試 SQL 標量 & 表 UDF 開(kāi)發(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ù)器上開(kāi)發(fā)的 Java 存儲過(guò)程只能在 Windows 32 位 和 AIX 32 位 Development Center 客戶(hù)機中進(jìn)行調試。

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

DB2 Development Center 例程導入、導出和部署支持

DB2 Development Center 提供了 Import Wizard、Export Wizard 和 Deployment Wizard,這些向導可用于幫助您轉移例程定義和部署例程。Import 和 Export 向導可用于將未編譯的 SQL 或 Java 例程定義從源機器轉移到目標機器。通過(guò)使用這些向導,還可以將編譯過(guò)的例程庫和源文件一起轉移。

一旦將先前導出的例程定義導入到一個(gè) Development Center 項目中,便可以使用 Deployment Wizard 來(lái)部署 SQL 或 Java 例程。部署向導提供了重新構建導出的例程源代碼,或者使用編譯過(guò)的與例程定義一起導入的必需的庫來(lái)部署例程這兩個(gè)選項。

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

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

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

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

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

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

  • 通過(guò)在目標服務(wù)器上執行例程的 CREATE 語(yǔ)句,在目標數據庫服務(wù)器中編目例程。
  • 重新構建和部署例程庫或類(lèi)到目標服務(wù)器的函數目錄中,這是可選的。

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





回頁(yè)首


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

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

開(kāi)發(fā)平臺獨立的應用程序和例程

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

使用 DB2 可移植數據類(lèi)型作為數字宿主變量

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

表 7:32 位 和 64 位應用程序中 C 和 C++ 數據類(lèi)型表示需要的位數

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

如果將一開(kāi)始為 32 位平臺編寫(xiě)的應用程序重新構建為 64 位應用程序,那么各種數據類(lèi)型可能需要的不同長(cháng)度將導致不正確的功能。例如,當運行那樣的應用程序時(shí),您可能會(huì )碰到數字數據被截斷的情況,以及由于內存地址被截斷而導致的無(wú)效數據,或者空指針引用錯誤。

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

  1. long long
  2. long
  3. __int64

您可以使用上面任何一種數據類(lèi)型來(lái)表示 BIGINT,但是您必須愿意接受下面對應用程序的限制:

  1. 如果使用 “long long”,那么應用程序只能在 UNIX 平臺上運行。
  2. 如果使用 “long”,那么應用程序只能在 64 位 UNIX 平臺上運行。
  3. 如果使用 “__int64”,那么應用程序只能在 Windows 平臺上運行。

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

表 7: 32 位 和 64 位應用程序中 C 和 C++ 數據類(lèi)型表示所需的位數

SQL 數據類(lèi)型 本地類(lèi)型 推薦的 DB2 UDB 可移植類(lèi)型
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)數據類(lèi)型總是以 32 位表示,因此總是適合 SQL INTEGER 值。

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

使用 LONGERROR YES 選項預編譯 C / C++ 應用程序

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

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

  1. 鏈接到 32 位或 64 位的數據庫。
  2. 在將 LONGERROR 選項的值指定為 YES 的情況下,使用 PRECOMPILE 命令預編譯應用程序。
  3. 對于每個(gè)因使用 long 數據類(lèi)型而報告出來(lái)的錯誤,用一種可移植的宿主變量聲明(例如 sqlint32 或 sqluint32)代替 long 數據類(lèi)型聲明。例如,將:
    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 報告出來(lái)的所有錯誤之后,再次根據目標數據庫預編譯應用程序,為應用程序創(chuàng )建一個(gè)包。

在構建 32 位還是 64 位應用程序或例程之間作出選擇

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

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

至于 COBOL,DB2 只支持在所有受支持的 32 位操作系統上和除 Linux IA 64 位 和 Linux zSeries 以外的所有受支持的 64 位操作系統平臺上運行 32 位 COBOL 應用程序。

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

構建支持跨平臺(32 位/ 64 位)部署的應用程序

為了減少應用程序運行時(shí)問(wèn)題出現的可能性,應該在應用程序將來(lái)所在的平臺上構建和測試應用程序代碼。如果這一點(diǎn)不合實(shí)際,例如沒(méi)有所需的編譯器,那么可以在一個(gè)平臺上構建應用程序,而將應用程序部署到它們將來(lái)運行時(shí)所在的平臺上,但是在鏈接應用程序和指定運行時(shí)庫路徑時(shí),應特別小心。

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

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

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

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

表 7: 32 位和 64 位應用程序中 C 和 C++ 數據類(lè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í)將應用程序鏈接到適當的一組 DB2 庫。而且還必須確保在編譯/鏈接時(shí),所鏈接到的庫在應用程序運行時(shí)是可用的。您可以依賴(lài)于可用的默認庫路徑,或者顯式地指定要使用的運行時(shí)庫路徑。下面的步驟列出了在不同場(chǎng)景中應該如何編譯和鏈接應用程序:

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

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

使用絕對路徑指定應用程序運行時(shí)庫路徑

當把應用程序從源計算機部署到另一臺目標計算機時(shí),考慮目標計算機上運行時(shí)庫路徑的規范很重要,因為在源計算機上鏈接庫時(shí)所使用的所有相對路徑在目標計算機上都可能是無(wú)效的。因此,在鏈接應用程序時(shí),或者在運行應用程序之前,通過(guò)一個(gè)附加的鏈接器選項使用絕對路徑來(lái)指定運行時(shí)庫路徑常常很有用 —— 大多數編譯器都提供了對該選項的支持。

下面的例子研究了用來(lái)指定運行時(shí)庫路徑的一些選項:

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

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

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

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

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

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

$HOME/sqllib/lib                                            

當 Joe 試圖在生產(chǎn)計算機上運行該應用程序時(shí),由于裝載器錯誤,運行將遭到失敗,因為生產(chǎn)計算機上的 $HOME 解析后不同于開(kāi)發(fā)環(huán)境中的路徑,所有找不到所需的運行時(shí)庫。這說(shuō)明了為什么相對路徑是有問(wèn)題的。

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

/usr/opt/db2_08_01/lib                                            

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

例 2:將應用程序從同一臺計算機上的 32 位實(shí)例部署到 64 位實(shí)例

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

-L$/usr/opt/db2_08_01/lib                                            

如果 Azuma 將他的實(shí)例更新為 64 位 DB2 實(shí)例,而保持所有其他目錄路徑不變,然后他嘗試運行應用程序,結果由于裝載器錯誤,導致應用程序不能運行,因為他鏈接應用程序時(shí)使用的運行時(shí)庫路徑現在被鏈接到 sqllib/lib64,而這里包含的是 64 位 DB2 庫。

為了避免發(fā)生這種情況,Azuma 應該顯式地將他的應用程序鏈接到 sqllib/lib32,而不是鏈接到默認的目錄路徑 sqllib/lib。如果 Azuma 這樣做了,他的應用程序就不會(huì )因實(shí)例被更新時(shí) DB2 默認庫目錄的改變而受到影響。加上我們在例 1 中學(xué)到的東西,對于 Azuma 來(lái)說(shuō),理想的運行時(shí)庫裝載路徑的指定應該如下所示:

/usr/opt/db2_08_01/lib32                                            

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

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

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

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

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

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

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

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

將 Windows 32 位應用程序部署到 Windows IA 64 位平臺

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

將 UNIX 32 位應用程序部署到 UNIX 64 位平臺

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

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

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

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

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

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

表 7: 32 位和 64 位應用程序中 C 和 C++ 數據類(lèi)型表示所需的位數

平臺 環(huán)境變量設置
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

注意:如果應用程序是以 +s 選項鏈接的,則該包裝器只能在 HP-UX 上運行。

您可以通過(guò)在命令行中輸入包裝器腳本名稱(chēng),后面跟上可執行文件名來(lái)運行這個(gè)包裝器程序:

	   <wrapper_script> <executable>                                            

如果包裝器腳本的庫路徑與被調用的可執行文件不兼容,那么對于調用其他可執行文件(例如帶有 C 系統調用)的應用程序來(lái)說(shuō),在包裝器內更改環(huán)境變量是不可行的。為了移植這些應用程序,必須重新鏈接目標文件,然后重新構建應用程序。

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

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

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

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

注意:

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

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

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





回頁(yè)首


結束語(yǔ)

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

本文應該有助于您:

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

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





回頁(yè)首


致謝

感謝 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 方面的軟件和信息開(kāi)發(fā)人員。先前,她曾作為一名應用開(kāi)發(fā)人員,從事過(guò) DB2 UDB for Linux、UNIX 和 Windows 產(chǎn)品的產(chǎn)品開(kāi)發(fā)工作。

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
ASP.NET與數據庫連接池
Oracle學(xué)習筆記(3)創(chuàng )建數據庫
[DB2使用小結
【oracle案例】ORA-01722
NoSQL 35 個(gè)非主流數據庫
數據訪(fǎng)問(wèn)技術(shù)路線(xiàn)圖
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久